С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
QWAN
58 / 57 / 1
Регистрация: 02.09.2008
Сообщений: 181
#1

Direct по книге Горнакова урок 8, запускается но 3DКуб не выводится - C++

03.03.2009, 15:26. Просмотров 979. Ответов 2
Метки нет (Все метки)

Начал учить Direct по книге Горнакова, урок №8 запускается но 3DКуб не выводится.
Ошибок вроде нет, библиотеки тоже подключены. Все запускается, а кубика невидно.
Вот весь файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
//------------------------------------------------------------------------
// LightMaterial.cpp
// используем освещение и материалы
//------------------------------------------------------------------------
// Стандартный включаемый файл Windows
#include <windows.h>    //подключаем заглавочный файл Windows
#include <d3d9.h>        //подключаем заглавочный файл DirectX 9 SDK
#include <d3dx9.h>        //структуры и функции для матриц
#include <mmsystem.h>    //для работы с системными функциями
#include <winbase.h>
// незабудте подключить в настройках d3d9.lib d3dx9.lib или
//#pragma comment (lib, "d3d9.lib")
//#pragma comment (lib, "d3dx9.lib")
//#pragma comment (lib, "winmm.lib")
//------------------------------------------------------------------------
//глобальные переменные
//------------------------------------------------------------------------
LPDIRECT3D9 pDirect3D = NULL;                //ук. на главн. интерфейс 1 обьек который создается
LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;    //ук. на обьект устройства
LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL; //указатель на буфер вершин - обнулили
LPDIRECT3DINDEXBUFFER9 pBufferIndex = NULL; //указатель на индексный буфер - обнулили
struct CUSTOMVERTEX //Структура задающая формат вершин
{
    float X, Y, Z;        //координаты вершин
    float nx, ny, nz;    //нормали
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)//формат вершин
//------------------------------------------------------------------------
//функция InitialDirect3D
//инициализируем Direct3D
//------------------------------------------------------------------------
HRESULT InitialDirect3D(HWND hwnd)
{
    if (NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))
        return E_FAIL;
    D3DDISPLAYMODE Display;
    if (FAILED(pDirect3D ->GetAdapterDisplayMode 
                                (D3DADAPTER_DEFAULT, &Display)))
        return E_FAIL;
    D3DPRESENT_PARAMETERS Direct3DParametr;
    ZeroMemory (&Direct3DParametr,sizeof (Direct3DParametr));
    Direct3DParametr.Windowed = TRUE; //FALSE - полнеэкранный режим
    Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD;
    Direct3DParametr.BackBufferFormat = Display.Format;
    Direct3DParametr.EnableAutoDepthStencil = TRUE;
    Direct3DParametr.AutoDepthStencilFormat = D3DFMT_D16;
    if (FAILED(pDirect3D ->CreateDevice(D3DADAPTER_DEFAULT, 
                                        D3DDEVTYPE_HAL,hwnd,
                                        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                        &Direct3DParametr, &pDirect3DDevice)))
        return E_FAIL;
    //включить отсечение Direct3D
    pDirect3DDevice ->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
    //подключаем Z - буфер
    pDirect3DDevice ->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    return S_OK;
}
//----------------------------------------------------------------------------
//функция InitialObject() создание обьекта
//----------------------------------------------------------------------------
HRESULT InitialObject()
{
    CUSTOMVERTEX Vershin[]=
    {
        {1.0f,  -1.0f, -1.0f, 0.0f, 0.0f, -1.0f}, //A
        {1.0f,   1.0f, -1.0f, 0.0f, 0.0f, -1.0f}, //B
        {-1.0f,  1.0f, -1.0f, 0.0f, 0.0f, -1.0f}, //C
        {-1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f}, //D
 
        {-1.0f,  -1.0f, -1.0f, -1.0f, 0.0f,  0.0f}, //A2
        {-1.0f,   1.0f, -1.0f, -1.0f, 0.0f,  0.0f}, //B2
        {-1.0f,   1.0f,  1.0f, -1.0f, 0.0f,  0.0f}, //C2
        {-1.0f,  -1.0f,  1.0f, -1.0f, 0.0f,  0.0f}, //D2
 
        {-1.0f,  -1.0f, 1.0f, 0.0f, 0.0f, 1.0f}, //A3
        {-1.0f,   1.0f, 1.0f, 0.0f, 0.0f, 1.0f}, //B3
        { 1.0f,   1.0f, 1.0f, 0.0f, 0.0f, 1.0f}, //C3
        { 1.0f,  -1.0f, 1.0f, 0.0f, 0.0f, 1.0f}, //D3
 
        {1.0f,  -1.0f,  1.0f, 1.0f, 0.0f,  0.0f}, //A4
        {1.0f,   1.0f,  1.0f, 1.0f, 0.0f,  0.0f}, //B4
        {1.0f,   1.0f, -1.0f, 1.0f, 0.0f,  0.0f}, //C4
        {1.0f,  -1.0f, -1.0f, 1.0f, 0.0f,  0.0f}, //D4
 
        { 1.0f,  -1.0f, -1.0f, 0.0f, -1.0f, 0.0f}, //A5
        {-1.0f,  -1.0f, -1.0f, 0.0f, -1.0f, 0.0f}, //B5
        {-1.0f,  -1.0f,  1.0f, 0.0f, -1.0f, 0.0f}, //C5
        { 1.0f,  -1.0f,  1.0f, 0.0f, -1.0f, 0.0f}, //D5
 
        { 1.0f,  1.0f,  1.0f, 0.0f, 1.0f, 0.0f}, //A6
        {-1.0f,  1.0f,  1.0f, 0.0f, 1.0f, 0.0f}, //B6
        {-1.0f,  1.0f, -1.0f, 0.0f, 1.0f, 0.0f}, //C6
        { 1.0f,  1.0f, -1.0f, 0.0f, 1.0f, 0.0f} //D6
        // X      Y      Z      
    };
    const unsigned short Index[] = {
        0,1,2,        2,3,0,
        4,5,6,        6,7,4,
        8,9,10,        10,11,8,
        12,13,14,    14,15,12,
        16,17,18,    18,19,16,
        20,21,22,    22,23,20
    };
    //создаем буфер вершин
    if (FAILED(pDirect3DDevice -> 
                            CreateVertexBuffer(
                            36*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, 
                            D3DPOOL_DEFAULT, &pBufferVershin, NULL)))
        return E_FAIL;
    //блокируем
    void* pBV;
    if (FAILED(pBufferVershin -> Lock(0, sizeof(Vershin), 
                                        (void**)&pBV, 0)))//блокирование буфера вершин
        return E_FAIL;
    memcpy(pBV, Vershin, sizeof(Vershin));    //копирование
    pBufferVershin ->Unlock();                //разблокирование
    //создаем индексный буфер
    pDirect3DDevice ->CreateIndexBuffer(36*sizeof(Index), 0,
        D3DFMT_INDEX16, D3DPOOL_DEFAULT, &pBufferIndex, NULL);
    //блокируем
    void* pBI;
    pBufferIndex -> Lock(0, sizeof(Index), (void**)&pBI, 0);
    //копируем
    pBufferIndex ->Unlock();
    return S_OK;
}
//----------------------------------------------------------------------------
//функция Matrix() матрицы мировая, вида и проекции  
//----------------------------------------------------------------------------
void Matrix()
{
    D3DXMATRIX MatrixWorld, MatrixWorldX, MatrixWorldY;        //мировая матрица
    D3DXMATRIX MatrixView;        //матрица вида
    D3DXMATRIX MatrixProjection;    //матрица проекции
    //MatrixWorld
    UINT Time = timeGetTime() %5000;
    FLOAT Angle = Time * (2.0f * D3DX_PI)/5000.0f;
    D3DXMatrixRotationX(&MatrixWorldX, Angle);
    D3DXMatrixRotationY(&MatrixWorldY, Angle);
    D3DXMatrixMultiply (&MatrixWorld, &MatrixWorldX, &MatrixWorldY);
    pDirect3DDevice ->SetTransform(D3DTS_WORLD, &MatrixWorld);
    //MatrixView
    D3DXMatrixLookAtLH(&MatrixView, &D3DXVECTOR3(0.0f, 0.0f, -8.0f),
                                    &D3DXVECTOR3(0.0f, 0.0f, 0.0f),
                                    &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
    pDirect3DDevice ->SetTransform(D3DTS_VIEW, &MatrixView);
    //MatrixProjection
    D3DXMatrixPerspectiveFovLH(&MatrixProjection,
        D3DX_PI/4, 1.0f, 1.0f, 100.0f);
    pDirect3DDevice ->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
}
 
 
//----------------------------------------------------------------------------
//функция LightMaterial() инициализация света и материала
//----------------------------------------------------------------------------
void LightMaterial()
{
    D3DMATERIAL9 Material;    // материал
    D3DLIGHT9 Light;        //свет
    //установим материал
    ZeroMemory(&Material, sizeof(D3DMATERIAL9));
    Material.Diffuse.r = Material.Ambient.r = 1.0f;
    Material.Diffuse.g = Material.Ambient.g = 1.0f;
    Material.Diffuse.b = Material.Ambient.b = 0.0f;
    Material.Diffuse.a = Material.Ambient.a = 1.0f;
    pDirect3DDevice ->SetMaterial(&Material);
    D3DXVECTOR3 VectorDir;
    //установим свет
    ZeroMemory(&Light, sizeof(D3DLIGHT9));
    Light.Type        = D3DLIGHT_DIRECTIONAL;
    Light.Diffuse.r    = 1.0f;
    Light.Diffuse.g    = 1.0f;
    Light.Diffuse.b = 1.0f;
    Light.Range        = 1000.0f;
    //установим нормаль
    VectorDir        = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
    D3DXVec3Normalize((D3DXVECTOR3*) &Light.Direction, &VectorDir);
 
    pDirect3DDevice ->SetLight(0, &Light);
    pDirect3DDevice ->LightEnable(0, TRUE);
 
    pDirect3DDevice ->SetRenderState(D3DRS_LIGHTING, TRUE);
    pDirect3DDevice ->SetRenderState(D3DRS_AMBIENT, 0);
}
 
    //--------------------------------------------------------------
    //RenderingDirect3D()
    //--------------------------------------------------------------
    void RenderingDirect3D()
    {
 
    if(pDirect3DDevice == NULL)    //проверяем ошибки
    return;
    pDirect3DDevice -> Clear(0, NULL, D3DCLEAR_TARGET |D3DCLEAR_ZBUFFER,
                            D3DCOLOR_XRGB(60, 100, 150), 1.0f, 0);
    //начало сцены
    pDirect3DDevice -> BeginScene();    
    //здесь происходит прорисовка сцены
    LightMaterial();
    Matrix();
    pDirect3DDevice ->SetStreamSource(0, pBufferVershin, 0,
                                        sizeof(CUSTOMVERTEX));
    pDirect3DDevice -> SetFVF(D3DFVF_CUSTOMVERTEX);
    pDirect3DDevice ->SetIndices(pBufferIndex);
    //вывод обьекта
    pDirect3DDevice ->DrawIndexedPrimitive (D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12);
    //конец сцены
    pDirect3DDevice -> EndScene();
    pDirect3DDevice -> Present(NULL, NULL, NULL, NULL);
}
//----------------------------------------------------------------------------
//функция DeleteDirect3D
//освобождение захваченых ресурсов
//----------------------------------------------------------------------------
void DeleteDirect3D()
{
    if (pBufferIndex != NULL)
        pBufferIndex -> Release();
 
    if (pBufferVershin != NULL)
        pBufferVershin -> Release();
 
    if (pDirect3DDevice!=NULL)
        pDirect3DDevice->Release();
 
    if (pDirect3D!=NULL)
        pDirect3D->Release();
}
//----------------------------------------------------------------------------
//Функция 
//----------------------------------------------------------------------------
 
//----------------------------------------------------------------------------
//Функция MainWinProc обратного вызова используется для обработки сообщений 
//----------------------------------------------------------------------------
LRESULT CALLBACK MainWinProc (HWND hwnd, 
                              UINT msg, 
                              WPARAM wparam, 
                              LPARAM lparam)
{
   switch(msg)
   {
      case WM_CREATE:    // Вызывается, когда впервые создается окно
         return(0);
      case WM_PAINT:    // Вызывается, когда окно обновляется
         RenderingDirect3D();
         ValidateRect(hwnd, NULL);
         return(0);
      case WM_DESTROY:    // Вызывается, когда пользователь закрывает окно
         DeleteDirect3D();//освобождаем ресурсы захваченные Direct3D
         PostQuitMessage(0); //завершает работу программы Windows. Это происходит, когда вы завершаете работу, щелкнув по кнопке закрытия окна.
         return(0);
      default:
         return DefWindowProc(hwnd, msg, wparam, lparam);//Если полученное сообщение не соответствует ни одному из проверяемых программой, оно возвращается функции WinMain()
   }
}
 
//-----------------------------------------------------------------------------
// Функция вызывается автоматически, когда программа запускается
int WINAPI WinMain (HINSTANCE hInstance, 
                    HINSTANCE hPrevInstance, 
                    LPSTR lpcmdline,
                    int ncmdshow)
{
   HWND         hwnd;    //создаем дескриптор окна
   MSG          msg;    //идентификатор сообщения
   WNDCLASSEX   windowsclass;//создаем клас окна
 
   // Настройка класса окна
   windowsclass.cbSize        = sizeof(WNDCLASSEX);//исп. для указания размера структуры данных
   windowsclass.style         = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;//для задания стиля создаваемого окна
   windowsclass.lpfnWndProc   = MainWinProc;//ук. указывает на функцию обработки сообщений Windows, которую окно использует чтобы принимать сообщения
   windowsclass.cbClsExtra    = 0;//число задает количество байт, которые будут выделены сразу за структурой данных класса окна.
                              //Я не имею ни малейшего представления, для чего это может быть нужно
                              //можете просто игнорировать этот член данных, поскольку система сама по умолчанию присваивает ему нулевое значение
   windowsclass.cbWndExtra    = 0; //задает количество байтов, которые будут выделены сразу за экземпляром окна.
                                //Работа с ним аналогична обращению с предыдущим членом структуры, и система также по умолчанию присваивает ему нулевое значение.
 
   windowsclass.hInstance     = hInstance;//дескриптором экземпляра к которому относится окнонная процедура класса.
                                        //В большинстве случаев можно задать значение дескриптора hInstance, получаемого функцией WinMain() в одном из параметров.
   windowsclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);//hIcon и имеет тип HICON. Тип HICON это ни что иное, как замаскированный тип HANDLE,
                                //поэтому он не должен смущать вас. Данный дескриптор указывает на класс значка, используемого окном.
                                //Класс значка в действительности является ресурсом значка. Не присваивайте этой переменной значение NULL,
                                //поскольку если сделать так, то программа будет перерисовывать изображение значка, при каждом свертывании окна.
   windowsclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
   windowsclass.hbrBackground = (HBRUSH) GetStockObject (GRAY_BRUSH);//цвет фона вашего окна
   windowsclass.lpszMenuName  = NULL;
   windowsclass.lpszClassName = L"Window Class"; // Имя класса
   windowsclass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
 
   // Регистрация класса окна
   if(!RegisterClassEx(&windowsclass))//параметр является указателем на структуру данных WNDCLASSEX
       return (0);
 
   // Создание окна
   if (!(hwnd = CreateWindowEx(NULL, 
      L"Window Class",            // Имя класса
      L"Свет и материал",   // Текст заголовка
      WS_OVERLAPPEDWINDOW|WS_VISIBLE,         // Cтили окна
      300,                         //целое число, задающее позицию окна на экране по горизонтали
      150,                         //целое число, задающее позицию окна на экране по вертикали
      500,                         //ширина окна в пикселах
      400,                         //высота окна в пикселах
      NULL,                         //указывает родителя данного окна (NULL - нет родителей)
      NULL,                         //дескриптор связанный с окном меню (NULL - меню нет)
      hInstance,                 //дескриптор экземпляра модуля.В этом параметре вы передаете дескриптор экземпляра, полученный функцией WinMain() в одном из ее параметров
      NULL)))
  return (0);
      //дополнительные данные создаваемого окна (NULL - нет доп. данных )
 
   if (SUCCEEDED(InitialDirect3D(hwnd)))
   {
       if(SUCCEEDED(InitialObject()))
       {
           // Отображение окна
           ShowWindow(hwnd, SW_SHOWDEFAULT);     //Первый параметр задает дескриптор отображаемого окна.
           UpdateWindow(hwnd);
           ZeroMemory(&msg, sizeof(msg));
           // Обработка сообщений, пока программа не будет прервана
           while(msg.message!=WM_QUIT)//указатель на объект MSG. Структура данных MSG содержит всю информацию о любом обнаруженном сообщении.
                                     //параметр указывает для какого окна проводится проверка наличия сообщений.
                                     //нижнюю границу кодов получаемых сообщений. Мы хотим получать все сообщения, поэтому присваиваем данному параметру значение 0
                                     //верхнюя граница кодов получаемых сообщений
           {
               if(PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
               {
                   TranslateMessage(&msg);//указатель на транслируемое сообщение.Преобразование клавиатурного ввода
                                 //Перед тем, как отправить сообщение в вашу очередь сообщений, вы должны транслировать его в символьные данные
                    DispatchMessage(&msg); //После того, как сообщение транслировано в символьные данные,
                                 //вы можете поместить его в очередь сообщений с помощью функции DispatchMessage().
               }
           else
               RenderingDirect3D();
           }
       }
   }
   return (0);    
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2009, 15:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Direct по книге Горнакова урок 8, запускается но 3DКуб не выводится (C++):

Некоторые изображения не показываются в игре по книге Горнакова - XNA
написал игру по книге горнакова. писал как в книге ну и где то ближе к концу все работало. падали человечки очки начислялись. добавил...

Не запускается игра (Ошибка графического интерфейса. Direct X недоступен) - Windows 7
Есть windows 7 64 bit. На ней не запускается игрушка. Вот скан проблемы

Урок по рисованию кнопок с двойным градиентом, есть ли такой урок - Photoshop
Помогите найти урок по рисованию вот таких кнопок с двойным градиентов

В окне Output выводится не та информация, что описано в книге, нормально ли это - C#
Доброго времени суток, уважаемые программисты и сисадмины. Начал изучать C# по книге Михаила Флёнова &quot;Библия C#, 2-е издание&quot;...

Не запускается программа по книге Learn Python the Hard Way - Python
не могу выполнить код предлагаемый в книге. Надеюсь на помощь. код предлагаемый к выполнению formatter = &quot;%r %r %r %r&quot; print...

Оценки, полученные учащимися за урок, занесены в массив. Подсчитать количество «5» и «2», полученных учащимися за урок и средний балл - Turbo Pascal
Оценки, полученные учащимися за урок, занесены в массив. Подсчитать количество «5» и «2», полученных учащимися за урок и средний балл.

2
ISergey
Maniac
Эксперт С++
1395 / 906 / 56
Регистрация: 02.01.2009
Сообщений: 2,706
Записей в блоге: 1
03.03.2009, 18:31 #2
C++
1
2
3
4
5
6
7
8
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void* pBI;
    pBufferIndex -> Lock(0, sizeof(Index), (void**)&pBI, 0);
    //копируем
    memcpy(pBI,Index,sizeof(Index));//! <-ты это забыл дописать
 
    pBufferIndex ->Unlock();
//~~~~~~~~~~~~~~~~~~~~~~~
1
QWAN
58 / 57 / 1
Регистрация: 02.09.2008
Сообщений: 181
03.03.2009, 18:36  [ТС] #3
Большое спасибо, получилось
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2009, 18:36
Привет! Вот еще темы с ответами:

Обучение по книге Страуструпа "принципы и практика C++". Не выводится "Hello, World" - C++
Ребят, помогите пожалуйста, пропал на первом же примере из книги, автор даёт код для вывода Hello world!#include &quot;std_lib_facilities.h&quot; ...

Не выводится изображение на экран и не пищит спикер при вставленной видеокарте, а со встроенной - запускается - Компьютерное железо
Здравствуйте. Случилось это днём... Я сидел за компьютером и смотрел видео про котиков. Как вдруг, экран стал в полоску (серого и...

При старте запускается вентилятор проца и сбрасывает обороты, на экран ничего не выводится - Материнские платы
Здравствуйте, есть мать H-Joshua-H61-uATX (Joshua) rev 3.00, которая не стартует. При старте запускается вентилятор проца и сбрасывает...

Нужно чтобы столбик в одной книге преобразовать в строку в другой книге - VBA
Здравствуйте. Нет ли какого изящного решения, чтобы столбик в одной книге преобразовать в строку в другой книге. Или надо переносить по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.