Вторник, 20 Апреля 2021, 03:14

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Программирование » C/C++ » Tutorial [EN/RU] : Инициализация OpenGL (Visual C++ & OpenGL)
Tutorial [EN/RU] : Инициализация OpenGL
WXZRWДата: Понедельник, 24 Августа 2009, 16:03 | Сообщение # 1
Thousand faces conspiration
Сейчас нет на сайте
Думаю, пора выкладывать. Данный тутор показывает инициализацию OpenGL и рендеринг простой сцены, а именно, пирамиды. Этот туториал основан на предыдущем, и новый код добавлен к уже имеющемуся. В данной теме будет только новый код, в исходнике же новый код помечен в комментариях - начало кода обозначено как New Code, и соответственно окончание нового кода обозначено как End.

Лицензия превыше всего : любая информация которая здесь предоставлена, может содержать те или иные неточности, код может не компилиться при некоторых условиях. Все что здесь есть, предоставлено мною без каких-либо гарантий и ответственности, и я не несу никакой ответственности за любой возможный ущерб, который может быть вызван использованием любой части данного поста, кода или информации в любом виде и при любых обстоятельствах.

Теперь новые данные :

* Подключим библиотеки, если они не подключены в настройках

Code
/* NEW CODE */

// Add required libs on fly, or you can set 'em up in Settings->Link menu

#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")

/* END */

* Заголовочные файлы тоже нужны

Code
/* NEW CODE */

#include <gl\gl.h>            
#include <gl\glu.h>

/* END */

* Также и контекст OpenGL

Code
/* NEW CODE */

HGLRC _glrc;

/* END */

* Обьявим новые функции

Code
/* NEW CODE */

void draw();

void setup_screen(int width,int height);

int _pixel_format(HDC dc);

/* END */

* В функции WinMain добавим новый код, но сперва здесь начало функции для наглядности

Code

// Below functions we need

// Main function
int WINAPI WinMain(HINSTANCE inst,HINSTANCE prev_inst,LPSTR line,int show)
{

* То что есть в предыдущем туторе пропустим и далее новый код - мы получаем хендл окна и вызываем 2 наших новых функции, то есть сперва настраиваем pixel format, а уже потом делаем настройки OpenGL для рендеринга.

Code

/* NEW CODE */

// Now we need device context

dc = GetDC(w_handle);

// Pass it to our pixel format setup func

_pixel_format(dc);

// After done, we want to setup GL stuff, i.e. perspective and etc.

setup_screen(640,480);

/* END */

* На этом дополнения заканчиваются, все что нужно, уже сделано. Немного старого кода, закрывающего функцию - тоже для наглядности

Code
return _process(w_handle); // return result back to, after it's handled by _process function
}

* Дальше в базовом коде была функция LRESULT CALLBACK w_process(HWND w_handle,UINT _msg,WPARAM wparam,LPARAM lparam), но она у нас без изменений, поэтому переходим еще дальше, и соответственно в функцию WPARAM _process(HWND w_handle), поскольку она небольшая, то весь ее код будет приведен ниже, новый и старый.

* Здесь мы добавляем условие else в наш цикл, вызываем нашу функцию для отрисовки сцены и свопируем буферы. Делаем мы это там, где раньше был комментарий по поводу возможности добавления функций для отрисовки т.д. в данном участке программы.

Code

// We will pass window handle to this one in WinMain function (at the end of)
WPARAM _process(HWND w_handle)
{
MSG msg;

// This one is the main application loop, it's infinite.

while(1)                     
{     
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Dispatch system messages
{    
if(msg.message == WM_QUIT) break; // If got WM_QUIT message then break the loop and exit from application

TranslateMessage(&msg);    // Otherwise, let's find out what the message is exactly       
DispatchMessage(&msg); // And execute it
}
          
/* NEW CODE */

// Below we draw our stuff
else
{
draw();

// Swap buffers
SwapBuffers(dc);
}

/* END */

}

return(msg.wParam);    
}

* На этом заканчиваются все модификации имеющихся функций, и идут новые, начнем с int _pixel_format(HDC dc) .

* Сперва мы обьявляем структуру PIXELFORMATDESCRIPTOR и заполняем ее, это настройки для OpenGL, в частности, это глубина Z-буфера, и глубина цвета, также мы установим тип пикселей PFD_TYPE_RGBA;, то есть составной цвет, это - красный, зеленый, синий и альфа канал. Цвета задаются путем смешивания вышеприведенных трех базовых цветов, альфа канал, это значение прозрачности. Также мы настраиваем accumulation и stencil буферы. Другие настройки мы пока не трогаем. Вообще рекомендую посмотреть самую подробную информацию на MSDN.com по этому вопросу.

Потом, нам нужно проверить как наш pixel format подходит к контексту устройства, и для этого мы используем ChoosePixelFormat(dc,&desc). Если проверка прошла успешно, мы назначаем данный pixel format вызывая функцию SetPixelFormat(dc,p_format,&desc).

Если обе эти вещи были успешно завершены, нам нужно создать контекст рендера для OpenGL, делаем это так - _glrc = wglCreateContext(dc);
Тем не менее, контекстов рендера может быть несколько, несмотря на то что мы создали только один контекст. Поэтому нам нужно сделать какой-либо из имеющихся контекстов рендера текущим. В нашем случае все просто - wglMakeCurrent(dc,_glrc);. Делать это нужно в любом случае, даже если контекст только один. Ниже код :

/

Code
/ Below func to set up pixel format and GL context

int _pixel_format(HDC dc)    
{    
// Our pixel format struct

PIXELFORMATDESCRIPTOR desc = {0};    

// Int variable to get ChoosePixelFormat func result

int p_format;    

// It's strongly recommended you to advance to MSDN for more info about this one below
// Note : not all the existing variables are set up here, but only required ones
       
desc.nSize = sizeof(PIXELFORMATDESCRIPTOR);    // Size of struct shulda be set to sizeof(PIXELFORMATDESCRIPTOR)     
desc.nVersion = 1; // Version shulda be set to 1            
                      
desc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; // Properties of pixel format
desc.dwLayerMask = PFD_MAIN_PLANE; // Although this was only used in earlier GL versions, we 'll set it up too        
desc.iPixelType = PFD_TYPE_RGBA; // Type of pixel data, we need RGBA (Red,Green,Blue, Alpha channel value)         
desc.cColorBits = 32; // If in RGBA mode, then it's size of color buffer excluding alpha values        
desc.cDepthBits = 24; // Depth of z-buffer (depth buffer)        
desc.cAccumBits = 0; // Accumulation buffer           
desc.cStencilBits = 0; // Stencil buffers          
       
// Check does pixel format match given device context or it ain't

if((p_format = ChoosePixelFormat(dc,&desc)) == FALSE )    
{    
return 0;    
}    

// If results from above are OK, we want to set our pixel format then
if (SetPixelFormat(dc,p_format,&desc) == FALSE)    
{     
return 0;    
}    
       
// If we're OK with pixel format, now we need to create GL rendering context for device context
_glrc = wglCreateContext(dc);

// We want to make our GL context to be current GL context, although we have no another contexts, we
// need to call this func in any case.
wglMakeCurrent(dc,_glrc);

return 1;
}

* Теперь мы настроим пару вещей в OpenGL, для отрисовки сцены. Это viewport, то есть область видимости в пределах окна, условно говоря. Мы задаем viewport так чтобы он соответствовал размерам окна. Можно сделать его и меньшим, так поступают например при рендеринге в текстуру. Для интереса, можно попробовать изменить ширину и длину на, допустим, 128х128. Также мы устанавливаем режим матриц в GL_PROJECTION и в GL_MODELVIEW. Это матрица проекции и матрица вида. Между этими делами мы также задаем и gluPerspective(......), это угол обзора, то есть FOV (Field Of View) в градусах, у нас это 90 градусов, потом соотношение сторон экрана (Aspect Ratio) и отсекающие плоскости, Z-Near и Z-Far (clipping planes).

Code

void setup_screen(int width,int height)
{
// Viewport dimensions
glViewport(0,0,width,height);

// Projection matrix
glMatrixMode(GL_PROJECTION);

// Identity matrix
glLoadIdentity();

// Perspective projection matrix
// Variables : FOV (field of view in angles), aspect ratio (x to y), Z near, Z far (both are clipping planes)
gluPerspective(90.0f,(float)width/(float)height,1.0f,10000.0f);

// Model view matrix
glMatrixMode(GL_MODELVIEW);    
       
// Identity matrix
glLoadIdentity();
}

* Пришло время заняться непосредственно сценой, эта функция последняя в туторе. Для начала мы очищаем экран и задаем идентичную матрицу.(Identity matrix). Потом мы трансформируем вид. Это нужно, чтобы навести камеру на пирамиду, которую будем рисовать, делаем это так -
gluLookAt(0,0,2.5,0,0,0,0,1,0); Здесь 9 параметров, первые 3 это позиция камеры в мировых координатах., другие 3 это вектор направления взгдяда, то есть, куда камера смотрит (в каком направлении), последние 3 - это up vector, то есть верх у нас это Y (в разных других программах/ играх верх может быть по оси Z).

Далее мы вертим пирамиду по осям Y и Z, используя glRotatef(.....);, также включаем тест глубины, чтобы определить, какие обьекты находятся ближе к камере или дальше, делаем это так - glEnable(GL_DEPTH_TEST);.

Пирамиду мы рисуем не целиком, а только боковые стены, 4 штуки, соответственно. Поскольку это треугольники (причем одна точка общая для всех 4), мы сообщаем об этом OpenGL - glBegin(GL_TRIANGLES);. Далее мы задаем цвет для каждого треугольника отдельно и рисуем каждый из них, то есть, мы задаем все три вершины треугольника, и подаем их на рендер, вызывая функцию glVertex3f(.....); для каждого из треугольников по три раза., то есть по одному разу для каждой из вершин треугольника. Закончив, мы сообщаем об этом в OpenGL - glEnd(); и также отключаем тест глубины - glDisable(GL_DEPTH_TEST);.

Код :

Code
void draw()    
{
// Clear the screen and load identity matrix
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    
glLoadIdentity();           

// View transform
// Variables : eye position (3 vars), view direction (3 vars), up vector (3 vars)
// Explanations : eye position is point from we're looking at, view direction is point we are    
// looking at, and up vector describes our coordinate system, we set Y to be pointed to the up
gluLookAt(0,0,2.5,0,0,0,0,1,0);

// Just a variable to change angle value (in degrees) to rotate our pyramid to
d = d + 0.5f;

// Rotate the pyramid using Z axis and Y axis, we pass our "d" variable below
// Variables : angle, axis (3 vars : x,y and z respectively)
glRotatef(d,0,0,1);
glRotatef((d*0.2f),0,1,0);

// Depth test to grab info how far objects are located from
glEnable(GL_DEPTH_TEST);

// Start to draw triangles
glBegin (GL_TRIANGLES);    

// Below we set up color for EACH triangle. We draw only 4 sides of pyramid, without drawing it's bottom.
// You can draw the bottom using GL_QUADS (you will need 1 quad then), or using GL_TRIANGLES (2 triangles to draw then)
       
glColor3ub(255,255,0);

// We draw triangle by setting up it's vertices, 3 at all.

// Note the pyramid has 5 vertices, 1 at the top, and 4 at the bottom. the top vertex is shared between all 4 sides (4 triangles as well)
        
glVertex3f(0, 1, 0);      
glVertex3f(-1, -1, -1);    
glVertex3f(1, -1, -1);

glColor3ub(255,0,0);

glVertex3f(0, 1, 0);      
glVertex3f(-1, -1, 1);    
glVertex3f(1, -1, 1);

glColor3ub(0,255,0);

glVertex3f(0, 1, 0);      
glVertex3f(-1, -1, -1);    
glVertex3f(-1, -1, 1);

glColor3ub(0,0,255);

glVertex3f(0, 1, 0);      
glVertex3f(1, -1, 1);    
glVertex3f(1, -1, -1);

// After we 're done with drawing, we need to stop it.
glEnd();
       
// And disable depth testing then
glDisable(GL_DEPTH_TEST);
}

*Как и в предыдущем туторе - Также прикладываю и .cpp исходник, для компиляции в Visual C++ нужно создать проект типа Win32 Application.

Скриншот :

Free Image Hosting at www.ImageShack.us

Вопросы и так далее - пишем в данной теме.

Прикрепления: core.cpp(11.1 Kb) · OpenGL__VS2008r.rar(9.6 Kb)
nilremДата: Понедельник, 24 Августа 2009, 19:15 | Сообщение # 2
Просветленный разум
Сейчас нет на сайте
Поймал три бага(с манифестом, с юникодом и с линковкой), связанных с настройками.
Наверное, лучше выкладывать весь проект.

А почему ты коменты в исходниках на русском не пишешь?

А так - нормальный туториал.
Я тут уже подумываю, а не запихнуть ли мне в движок OpenGL рендерер.


Windmill 2

WindMill 2D Game Engine
WXZRWДата: Понедельник, 24 Августа 2009, 20:37 | Сообщение # 3
Thousand faces conspiration
Сейчас нет на сайте
Quote (nilrem)
Поймал три бага(с манифестом, с юникодом и с линковкой), связанных с настройками.
Наверное, лучше выкладывать весь проект.

Ну это можно настроить в Visual C++, в лицензии сказано что в разных версиях могут быть некие отличия.

Quote (nilrem)
А почему ты коменты в исходниках на русском не пишешь?

Так быстрее, потому что в английском нет conjugation для adjective и noun (в смысле нет форм прилагательных и существительных слов), вобщем из двух иностранных это самый простой язык, там не все есть в грамматике что в других языках. И также он многим понятен в разных странах, больше чем только из тех кто русский знает аудитория.

Quote (nilrem)
А так - нормальный туториал.

Ну основы тут показаны, вроде все должно быть понятно.

Xe[N]oДата: Понедельник, 09 Января 2012, 05:43 | Сообщение # 4
частый гость
Сейчас нет на сайте
А как подключить двойную буферизацию?
mopoДата: Суббота, 03 Марта 2012, 13:15 | Сообщение # 5
был не раз
Сейчас нет на сайте
А как подключить двойную буферизацию?

glutInitDisplayMode(GLUT_DOUBLE) это в библиотеке GLUT


Источник усталости - не в теле, а в уме. Ты можешь гораздо больше, чем думаешь.
ТритонДата: Вторник, 24 Апреля 2012, 11:02 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Quote (WXZRW)
dc = GetDC(w_handle);
Это по какому сообщению, какой тип имеет переменная dc и какова семантика этой переменной?


Не всё так плохо, как оно есть на самом деле.
ApatiДата: Вторник, 24 Апреля 2012, 11:25 | Сообщение # 7
заслуженный участник
Сейчас нет на сайте
Quote (Тритон)
Это по какому сообщению, какой тип имеет переменная dc и какова семантика этой переменной?

http://msdn.microsoft.com/en-us/library/dd144871(v=VS.85).aspx
ТритонДата: Вторник, 24 Апреля 2012, 11:57 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Допустим. Но какова в данном случае семантика переменной dc и по каком сообщению её присваивать? Ведь первый то пост писан не в мелкососфте. Откуда там знать, констекст какого девайса понадобился форумчанину и для чего?

Не всё так плохо, как оно есть на самом деле.

Сообщение отредактировал Тритон - Вторник, 24 Апреля 2012, 11:58
ApatiДата: Вторник, 24 Апреля 2012, 12:31 | Сообщение # 9
заслуженный участник
Сейчас нет на сайте
device context в вин апи используется для работы с графикой через GDI (любая функция рисования там требует первым параметром контекст устройства). Т.е. это что-то вроде холста, на котором происходит рисование. Каждое окно может иметь свой контекст. Получить его можно в любой момент после создания и до удаления окна.

В данном случае контекст устройства используется для инициализации OpenGL.


Сообщение отредактировал Apati - Вторник, 24 Апреля 2012, 12:35
ТритонДата: Вторник, 24 Апреля 2012, 12:51 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
Quote (Apati)
device context в вин апи используется для работы с графикой через GDI (любая функция рисования там требует первым параметром контекст устройства)
Птзолдта прочитать и сам могу. Объясни толком, чей контекст.
Quote (Apati)
В данном случае контекст устройства используется для инициализации OpenGL.
Допустим. А от какого окна?
Quote (Apati)
Получить его можно в любой момент после создания и до удаления окна.
Допустим. Но вот в педзолдтовых примерах его не надо получать в мессаге WM_CREATE. А в каком событии это надо сделать в данном случае?


Не всё так плохо, как оно есть на самом деле.
ApatiДата: Вторник, 24 Апреля 2012, 12:59 | Сообщение # 11
заслуженный участник
Сейчас нет на сайте
Quote (Тритон)
Объясни толком, чей контекст.

В каком смысле чей?
Quote (Тритон)
А от какого окна?

Которое было создано ранее в функции WinMain
Quote (Тритон)
А в каком событии это надо сделать в данном случае?

Можно и в WM_CREATE, можно и просто после вызова функции CreateWindowEx.
ТритонДата: Вторник, 24 Апреля 2012, 13:27 | Сообщение # 12
постоянный участник
Сейчас нет на сайте
То есть это можно делать вообще вне сообщений?

Не всё так плохо, как оно есть на самом деле.
ApatiДата: Вторник, 24 Апреля 2012, 13:30 | Сообщение # 13
заслуженный участник
Сейчас нет на сайте
Quote (Тритон)
То есть это можно делать вообще вне сообщений?

Да
ТритонДата: Пятница, 11 Мая 2012, 06:10 | Сообщение # 14
постоянный участник
Сейчас нет на сайте
Code

...
#pragma comment(lib, "opengl32.lib")  
#pragma comment(lib, "glu32.lib")
...
HGLRC            OpenGLContext;
....
OpenGLContext=wglCreateContext(WindowContext);//Гога, если разремировать эту строку.
...
Гога такая:
Quote
Compiler: Default compiler
Building Makefile: "C:\Projects\cpp\dev\SeaJackals\Makefile.win"
Executing make...
make.exe -f "C:\Projects\cpp\dev\SeaJackals\Makefile.win" all
g++.exe -D__DEBUG__ -c SeaJackals.cpp -o SeaJackals.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" -pg -g3

g++.exe -D__DEBUG__ SeaJackals.o -o "SeaJackals.exe" -L"C:/Dev-Cpp/lib" -L"C:/Dev-Cpp/lib" -L"C:/Dev-Cpp/libexec" -mwindows -lgmon -pg -g3

make.exe: *** [SeaJackals.exe] Error 1

Execution terminated

Добавлено (11.05.2012, 06:10)
---------------------------------------------
Ни когда не поверю, что у меня какая то сложная гога. Тупейший же глюк. Как с ним бороться?


Не всё так плохо, как оно есть на самом деле.
Lord_ZeonДата: Пятница, 11 Мая 2012, 07:22 | Сообщение # 15
частый гость
Сейчас нет на сайте
Тритон,
Возможно проблема с линковкой, так как сам только что собрал проект на gcc в devcpp, все работает.





Сообщение отредактировал Lord_Zeon - Пятница, 11 Мая 2012, 07:32
ТритонДата: Пятница, 11 Мая 2012, 07:25 | Сообщение # 16
постоянный участник
Сейчас нет на сайте
Quote (Lord_Zeon)
Возможно проблема с линковкой,
Ну а с чем ещё? Конечно с линковкой. Бороться то с ней как?

Добавлено (11.05.2012, 07:25)
---------------------------------------------

Quote (Lord_Zeon)
Намек на то чтобы сменить IDE на более гибкое
Посоветуй какое нибудь.


Не всё так плохо, как оно есть на самом деле.
Lord_ZeonДата: Пятница, 11 Мая 2012, 07:31 | Сообщение # 17
частый гость
Сейчас нет на сайте
Тритон,
К примеру Code Blocks (сам раньше пользовался), сейчас перешел на Visual Studio в общем выбирать тебе.

В линкере должны быть подключены:
ТритонДата: Пятница, 18 Мая 2012, 12:00 | Сообщение # 18
постоянный участник
Сейчас нет на сайте
Quote (Lord_Zeon)
D:/C++/OpenGL SDK/Glut/lib/libglut32.a
А где взять OpenGL SDK?

Добавлено (11.05.2012, 08:32)
---------------------------------------------

Quote (Lord_Zeon)
Code Blocks
Нашёл такую страницу: http://www.codeblocks.org/downloads. А с какой ссылки качать чего то не понял.

Добавлено (11.05.2012, 09:14)
---------------------------------------------
Ващё!

Quote
||=== SeaJackals, Debug ===|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\libmingw32.a(main.o):main.c|| undefined reference to `WinMain@16'|
||=== Build finished: 1 errors, 0 warnings ===|

Добавлено (11.05.2012, 09:16)
---------------------------------------------
И

Quote
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|4|error: fstream.h: No such file or directory|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|5|error: iostream.h: No such file or directory|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|10|warning: ignoring #pragma comment |
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|12|warning: ignoring #pragma comment |
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|13|warning: ignoring #pragma comment |
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|228|warning: "/*" within comment|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|15|error: 'ofstream' in namespace 'std' does not name a type|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp||In function 'int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)':|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|40|error: 'Log' was not declared in this scope|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|41|error: 'endl' was not declared in this scope|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp||In function 'bool InitApplication(HINSTANCE__*, int)':|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|90|error: 'Log' was not declared in this scope|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|90|error: 'endl' was not declared in this scope|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp||In function 'LRESULT WindowProcedureMainWindow(HWND__*, UINT, WPARAM, LPARAM)':|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|180|error: 'Log' was not declared in this scope|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|180|error: 'endl' was not declared in this scope|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp||In function 'bool SetOpenGLPixelFormat(HDC__*)':|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|195|error: 'Log' was not declared in this scope|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|195|error: 'endl' was not declared in this scope|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp||In function 'void SetupScreen(int, int)':|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|248|error: 'Log' was not declared in this scope|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|248|error: 'endl' was not declared in this scope|
||=== Build finished: 13 errors, 4 warnings ===|

Добавлено (11.05.2012, 09:20)
---------------------------------------------
Вроде с файлами проекта и головами разобрался. Но

Quote
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|10|warning: ignoring #pragma comment |
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|12|warning: ignoring #pragma comment |
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|13|warning: ignoring #pragma comment |
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|228|warning: "/*" within comment|
obj\Debug\SeaJackals.o||In function `Z20SetOpenGLPixelFormatP5HDC__':|
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|226|undefined reference to `wglCreateContext@4'|
||=== Build finished: 1 errors, 4 warnings ===|
. При
Code
//=================================================================================================
#include <windows.h>
//=================================================================================================
#include <fstream>
#include <iostream>
//=================================================================================================
#include <gl\gl.h>
#include <gl\glu.h>
//=================================================================================================
#pragma comment( lib, "Gdi32.a" )
//=================================================================================================
#pragma comment(lib, "libglu32.a" )
#pragma comment(lib, "libopengl32.a" )
//=================================================================================================

Добавлено (18.05.2012, 12:00)
---------------------------------------------

Quote (WXZRW)
gluPerspective(90.0f,(float)width/(float)height,1.0f,10000.0f);
А если не ставить f и вместо float написать double?


Не всё так плохо, как оно есть на самом деле.
RacotДата: Пятница, 18 Мая 2012, 12:24 | Сообщение # 19
постоянный участник
Сейчас нет на сайте


Специалист "во всем" - специалист "ни в чем"
------------------------------------
Script Reference для Unity3D
Помогу со скриптами for Unity3D


Сообщение отредактировал Racot - Пятница, 18 Мая 2012, 12:26
ТритонДата: Суббота, 19 Мая 2012, 19:50 | Сообщение # 20
постоянный участник
Сейчас нет на сайте
Code
//=================================================================================================
#include <windows.h>
//=================================================================================================
#include <fstream>
#include <iostream>
//=================================================================================================
#include <gl\gl.h>
#include <gl\glu.h>
//=================================================================================================
std::ofstream    Log;
//=================================================================================================
HGLRC            OpenGLContext;
//=================================================================================================
bool             InitApplication           (HINSTANCE  Instance     ,
                    int        Show         );
//=================================================================================================
LRESULT CALLBACK WindowProcedureMainWindow (HWND       Window       ,
                    UINT       Message      ,
                    WPARAM     First        ,
                    LPARAM     Second       );
//=================================================================================================
bool             SetOpenGLPixelFormat      (HDC        WindowContext);
//=================================================================================================
void             SetupScreen               (int        Width        ,
                    int        Height       );
//=================================================================================================
void             OpenGLRender              (                        );
//=================================================================================================
int  WINAPI      WinMain                   (HINSTANCE  Instance     ,
                    HINSTANCE  Previus      ,
                    LPSTR      CommandLine  ,
                    int        Show         )
{
  MSG Message;
  Log.open("Log.Log");
  Log<<"OpenGLContext at"<<(void *)&OpenGLContext<<"."<<std::endl;
  Log<<"WinMain                   at"<<(void *)WinMain                  <<"."<<std::endl;
  Log<<"InitApplication           at"<<(void *)InitApplication          <<"."<<std::endl;
  Log<<"WindowProcedureMainWindow at"<<(void *)WindowProcedureMainWindow<<"."<<std::endl;
  Log<<"SetOpenGLPixelFormat      at"<<(void *)SetOpenGLPixelFormat     <<"."<<std::endl;
  Log<<"SetupScreen               at"<<(void *)SetupScreen              <<"."<<std::endl;
  Log<<"OpenGLRender              at"<<(void *)OpenGLRender             <<"."<<std::endl;
  Log<<"WinMain is starting."<<std::endl;
  Log<<"Instance   ="<<(void *)Instance<<" at "<<(void *)&Instance<<"."<<std::endl;
  Log<<"Previus    ="<<(void *)Previus<<" at "<<(void *)&Previus<<"."<<std::endl;
  Log<<"CommandLine=\""<<CommandLine<<"\" at "<<(void *)CommandLine<<", pointer at "<<(void *)&CommandLine<<"."<<std::endl;
  Log<<"Show       ="<<Show<<" at "<<(void *)&Show<<"."<<std::endl;
  Log<<"Message at "<<(void *)&Message<<"."<<std::endl;
  if (InitApplication(Instance, Show))
  {
   Log<<"WinMain is continueing."<<std::endl;
   Log<<"Main loop is starting."<<std::endl;
   do
   {
    if (PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))
    {
     TranslateMessage(&Message);
     DispatchMessage (&Message);
    }
    else
    {
     OpenGLRender();
    }
   } while (Message.message != WM_QUIT);
   Log<<"WinMain is continueing."<<std::endl;
   Log<<"Main loop is ending."<<std::endl;
  }
  else
  {
   Log<<"WinMain is continueing."<<std::endl;
  }
  Log<<"WinMain is ending with 0."<<std::endl;
  Log.close();
  return 0;
}
//=================================================================================================
bool             InitApplication           (HINSTANCE  Instance     ,
                    int        Show         )
{
  HDC  WindowContext;
  char ApplicationName[16]="Sea jackals";
  char WindowClassMain[32]="Sea jackals.Window class.Main.";
  HWND WindowMain;
  WNDCLASSEX WindowClass;
  Log<<"InitApplication is starting."<<std::endl;
  Log<<"ApplicationName=\""<<ApplicationName<<"\" at "<<(void *)ApplicationName<<"."<<std::endl;
  Log<<"WindowClassMain=\""<<WindowClassMain <<"\" at "<<(void *)WindowClassMain<<"."<<std::endl;
  Log<<"Instance="<<(void *)Instance<<" at "<<(void *)&Instance<<"."<<std::endl;
  Log<<"Show    ="<<        Show    <<" at "<<(void *)&Show    <<"."<<std::endl;
  WindowClass.cbSize       =        sizeof        (WindowClass                 );
  WindowClass.style        =        CS_HREDRAW|
                    CS_VREDRAW;
  WindowClass.lpfnWndProc  =        WindowProcedureMainWindow;
  WindowClass.cbClsExtra   =        0;
  WindowClass.cbWndExtra   =        0;
  WindowClass.hInstance    =        Instance;
  WindowClass.hIcon        =        LoadIcon      (NULL       , IDI_APPLICATION);
  WindowClass.hCursor      =        LoadCursor    (NULL       , IDC_ARROW      );
  WindowClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH                 );
  WindowClass.lpszMenuName =        NULL;
  WindowClass.lpszClassName=        WindowClassMain;
  WindowClass.hIconSm      =        LoadIcon      (NULL       , IDI_APPLICATION);
  Log<<"WindowClass at "<<(void *)&WindowClass<<"."<<std::endl;
  Log<<"WindowClass.cbSize       ="  <<        WindowClass.cbSize       <<" at "  <<(void *)&WindowClass.cbSize       <<"."<<std::endl;
  Log<<"WindowClass.style        ="  <<        WindowClass.style        <<" at "  <<(void *)&WindowClass.style        <<"."<<std::endl;
  Log<<"WindowClass.lpfnWndProc  ="  <<(void *)WindowClass.lpfnWndProc  <<" at "  <<(void *)&WindowClass.lpfnWndProc  <<"."<<std::endl;
  Log<<"WindowClass.cbClsExtra   ="  <<        WindowClass.cbClsExtra   <<" at "  <<(void *)&WindowClass.cbClsExtra   <<"."<<std::endl;
  Log<<"WindowClass.cbWndExtra   ="  <<        WindowClass.cbWndExtra   <<" at "  <<(void *)&WindowClass.cbWndExtra   <<"."<<std::endl;
  Log<<"WindowClass.hInstance    ="  <<(void *)WindowClass.hInstance    <<" at "  <<(void *)&WindowClass.hInstance    <<"."<<std::endl;
  Log<<"WindowClass.hIcon        ="  <<(void *)WindowClass.hIcon        <<" at "  <<(void *)&WindowClass.hIcon        <<"."<<std::endl;
  Log<<"WindowClass.hCursor      ="  <<(void *)WindowClass.hCursor      <<" at "  <<(void *)&WindowClass.hCursor      <<"."<<std::endl;
  Log<<"WindowClass.hbrBackground="  <<(void *)WindowClass.hbrBackground<<" at "  <<(void *)&WindowClass.hbrBackground<<"."<<std::endl;
  Log<<"WindowClass.lpszMenuName ="  <<(void *)WindowClass.lpszMenuName <<" at "  <<(void *)&WindowClass.lpszMenuName <<"."<<std::endl;
  Log<<"WindowClass.lpszClassName=\""<<        WindowClass.lpszClassName<<"\" at "<<(void *) WindowClass.lpszClassName<<", poinet at "<<(void *)&WindowClass.lpszClassName<<"."<<std::endl;
  Log<<"WindowClass.hIconSm      ="  <<(void *)WindowClass.hIconSm      <<" at "  <<(void *)&WindowClass.hIconSm      <<"."<<std::endl;
  RegisterClassEx(&WindowClass);
  Log<<"The main window class is registering."<<std::endl;
  WindowMain=CreateWindow(WindowClassMain    ,
                          ApplicationName    ,
                          WS_OVERLAPPEDWINDOW,
                          0                  ,
                          0                  ,
                          528                ,
                          704                ,
                          NULL               ,
                          NULL               ,
                          Instance           ,
                          NULL               );
  Log<<"InitApplication is continueing."<<std::endl;
  Log<<"WindowMain="<<(void *)WindowMain<<" at "<<(void *)&WindowMain<<"."<<std::endl;
  if (WindowMain)
  {
   ShowWindow  (WindowMain, Show);
   Log<<"Main window is showing by"<<Show<<"."<<std::endl;
   UpdateWindow(WindowMain);
   Log<<"Main window is updating."<<std::endl;
   WindowContext=GetDC(WindowMain);
   Log<<"WindowContext="<<(void *)WindowContext<<" at "<<(void *)&WindowContext<<"."<<std::endl;
   if(WindowContext)
   {
    if (SetOpenGLPixelFormat(WindowContext))
    {
     Log<<"InitApplication is continueing."<<std::endl;
     Log<<"Open GL context is seting."<<std::endl;
     SetupScreen(528,704);
     Log<<"InitApplication is continueing."<<std::endl;
     ReleaseDC(WindowMain, WindowContext);
     Log<<"WindowContext is releasing."<<std::endl;
     Log<<"InitApplication is ending with true."<<std::endl;
     return true;
    }
    else
    {
     Log<<"InitApplication is continueing."<<std::endl;
     Log<<"Open GL context is notseting."<<std::endl;
     ReleaseDC(WindowMain, WindowContext);
     Log<<"WindowContext is releasing."<<std::endl;
     Log<<"InitApplication is ending with false."<<std::endl;
     return false;
    }
   }
   Log<<"InitApplication is ending with false."<<std::endl;
  }
  Log<<"InitApplication is ending with false."<<std::endl;
  return false;
}
//=================================================================================================
LRESULT CALLBACK WindowProcedureMainWindow (HWND       Window       ,
                    UINT       Message      ,
                    WPARAM     First        ,
                    LPARAM     Second       )
{
  switch (Message)
  {
   case WM_DESTROY:  Log<<"WindowProcedureMainWindow is stating."<<std::endl;
                     Log<<"Window ="<<(void *)Window<<" at "<<(void *)&Window <<"."<<std::endl;
                     Log<<"Message=WM_DESTROY at "<<(void *)&Message<<"."<<std::endl;
                     Log<<"First  ="<<(void *)First <<" at "<<(void *)&First  <<"."<<std::endl;
                     Log<<"Second ="<<(void *)Second<<" at "<<(void *)&Second <<"."<<std::endl;
                     PostQuitMessage(0);
   break;
  }
  return DefWindowProc (Window, Message, First, Second);
}
//=================================================================================================
bool             SetOpenGLPixelFormat      (HDC        WindowContext)
{
  PIXELFORMATDESCRIPTOR Descriptor;
  int                   Format;
  Log<<"SetOpenGLPixelFormat is stating."<<std::endl;
  Log<<"WindowContext="<<(void *)WindowContext<<" at "<<(void *)&WindowContext<<"."<<std::endl;
  Descriptor.nSize       =sizeof(Descriptor);
  Descriptor.nVersion    =1;
  Descriptor.dwFlags     =PFD_DRAW_TO_WINDOW|
                          PFD_SUPPORT_OPENGL|
                          PFD_DOUBLEBUFFER;
  Descriptor.dwLayerMask =PFD_MAIN_PLANE;
  Descriptor.iPixelType  =PFD_TYPE_RGBA;
  Descriptor.cColorBits  =32;
  Descriptor.cDepthBits  =24;
  Descriptor.cAccumBits  = 0;
  Descriptor.cStencilBits= 0;
  Log<<"Descriptor at "<<(void *)&Descriptor<<"."<<std::endl;
  Log<<"Descriptor.nSize       ="<<     Descriptor.nSize       <<" at "<<(void *)&Descriptor.nSize       <<"."<<std::endl;
  Log<<"Descriptor.nVersion    ="<<     Descriptor.nVersion    <<" at "<<(void *)&Descriptor.nVersion    <<"."<<std::endl;
  Log<<"Descriptor.dwFlags     ="<<     Descriptor.dwFlags     <<" at "<<(void *)&Descriptor.dwFlags     <<"."<<std::endl;
  Log<<"Descriptor.dwLayerMask ="<<     Descriptor.dwLayerMask <<" at "<<(void *)&Descriptor.dwLayerMask <<"."<<std::endl;
  Log<<"Descriptor.iPixelType  ="<<(int)Descriptor.iPixelType  <<" at "<<(void *)&Descriptor.iPixelType  <<"."<<std::endl;
  Log<<"Descriptor.cColorBits  ="<<(int)Descriptor.cColorBits  <<" at "<<(void *)&Descriptor.cColorBits  <<"."<<std::endl;
  Log<<"Descriptor.cDepthBits  ="<<(int)Descriptor.cDepthBits  <<" at "<<(void *)&Descriptor.cDepthBits  <<"."<<std::endl;
  Log<<"Descriptor.cAccumBits  ="<<(int)Descriptor.cAccumBits  <<" at "<<(void *)&Descriptor.cAccumBits  <<"."<<std::endl;
  Log<<"Descriptor.cStencilBits="<<(int)Descriptor.cStencilBits<<" at "<<(void *)&Descriptor.cStencilBits<<"."<<std::endl;
  Format=ChoosePixelFormat(WindowContext, &Descriptor);
  Log<<"Format="<<Format<<" at "<<(void *)&Format<<"."<<std::endl;
  if (Format)
  {
   Log<<"Format is right."<<std::endl;
   if (SetPixelFormat(WindowContext, Format, &Descriptor))
   {
    Log<<"Pixel format is seting."<<std::endl;
    OpenGLContext=wglCreateContext(WindowContext);
    Log<<"OpenGL context is creating."<<std::endl;
    wglMakeCurrent(WindowContext, OpenGLContext);
    Log<<"OpenGL context is making current."<<std::endl;
    Log<<"SetOpenGLPixelFormat is ending with true."<<std::endl;
    return true;
   }
   else
   {
    Log<<"Pixel format is notseting."<<std::endl;
   }
  }
  else
  {
   Log<<"Format is wrong."<<std::endl;
  }
  Log<<"SetOpenGLPixelFormat is ending false."<<std::endl;
  return false;
}
//=================================================================================================
void             SetupScreen               (int        Width        ,
                    int        Height       )
{
  Log<<"SetupScreen is stating."<<std::endl;
  Log<<"Width ="<<Width <<" at "<<(void *)&Width <<"."<<std::endl;
  Log<<"Height="<<Height<<" at "<<(void *)&Height<<"."<<std::endl;
  glViewport(0, 0, Width, Height);
  Log<<"OpenGL viewport is seting with the coodrdinates: 0, 0, "<<Width<<", "<<Height<<"."<<std::endl;
  glMatrixMode(GL_PROJECTION);
  Log<<"OpenGL matrix mode is seting to "<<GL_PROJECTION<<"."<<std::endl;
  glLoadIdentity();
  Log<<"OpenGL identity loading."<<std::endl;
  gluPerspective(90.0, (double)Width/(double)Height, 1.0, 10000.0);
  Log<<"OpenGL glu perspective is seting with the parametrs: "<<90.0<<", "<<(double)Width/(double)Height<<", "<<1.0<<", "<<10000.0<<"."<<std::endl;
  glMatrixMode(GL_MODELVIEW);
  Log<<"OpenGL matrix mode is seting to "<<GL_MODELVIEW<<"."<<std::endl;
  glLoadIdentity();
  Log<<"OpenGL identity loading."<<std::endl;
  Log<<"SetupScreen is ending."<<std::endl;
}
//=================================================================================================
void             OpenGLRender              (                        )
{
  static double d=0.0;
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  gluLookAt (0.0, 0.0, 1.8, 0.0, 1.0, 0.0 , 0.0, 0.0, 1.0);
  glEnable(GL_DEPTH_TEST);
  GL_TRIANGLES;
  glColor3ub(255,255,0);
  glVertex3d(0.0, 2.0, 0.0);
  glVertex3d(1.0, 2.0, 0.0);
  glVertex3d(0.0, 2.0, 1.0);
  glDisable(GL_DEPTH_TEST);
}
//=================================================================================================
Не вижу ни какого треугольника, хотя по идее смотрю на него.


Не всё так плохо, как оно есть на самом деле.
Форум игроделов » Программирование » C/C++ » Tutorial [EN/RU] : Инициализация OpenGL (Visual C++ & OpenGL)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2021 Рейтинг