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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Получение доступа к файлам папки http://www.cyberforum.ru/cpp/thread24804.html
Товарищи программисты, поскажите, пожалуйста, каким образом получить имена файлов (всех, в том числе и подпапок) некоторой папки и как проверить, является ли некоторый файл обычным или папкой?...
C++ Aero в программе В стандартных программах Windows (просмотр изображений, выбор гаджетов боковой панели и т.п) видно, что у них прозрачен не только заголовок, но и их часть (либо окно целиком (как в выборе... http://www.cyberforum.ru/cpp/thread24460.html
C++ Что такое компилятор, и где его взять?
Здравствуйте дорогие форумчане! Вот начал изучать по самоучителям С++ и сталкнулся с таким термином, как компилятор. Я так понял он преобразовает программу в рабочее состояние (если что-то не так...
C++ Вариант компилирования bat в exe
Увжаемые пользовтаели. У меня появилась необходимость написать определённый скрипт запуска. Сделал его batником, т.к. ноль в программировании. А теперь требуется сделать его ексешкой. Знаю что есть...
C++ Цифровая подпись Фиата-Шамира http://www.cyberforum.ru/cpp/thread23870.html
Нужно реализовать цифровую подпись Фиата-Шамира. Помогите кто чем может. Может есть какая нибудь теория, алгоритм или даже реализация на С++ ? Заранее благодарен. :)
C++ C++ или же Visual C++ Помогите определится какой язык больше подходит для написания от простеньких игр до сложнейших, чтобы был актуален ближайшие 10 лет. И ещё хотел бы узнать главные отличия этих двух языков, и где... подробнее

Показать сообщение отдельно
QWAN
58 / 57 / 1
Регистрация: 02.09.2008
Сообщений: 181

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

03.03.2009, 15:26. Просмотров 978. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.