#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
HWND Hwnd;
HGLRC Hglrc;
HDC Hdc;
void Render()
{
glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SwapBuffers(wglGetCurrentDC());
}
void InitOpenGL(HWND hwnd)
{
int pf;
PIXELFORMATDESCRIPTOR pfd;
Hdc = GetDC(hwnd);
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cRedBits = 8;
pfd.cRedShift = 16;
pfd.cGreenBits = 8;
pfd.cGreenShift = 8;
pfd.cBlueBits = 8;
pfd.cBlueShift = 0;
pfd.cAlphaBits = 0;
pfd.cAlphaShift = 0;
pfd.cAccumBits = 64;
pfd.cAccumRedBits = 16;
pfd.cAccumGreenBits = 16;
pfd.cAccumBlueBits = 16;
pfd.cAccumAlphaBits = 0;
pfd.cDepthBits = 32;
pfd.cStencilBits = 8;
pfd.cAuxBuffers = 0;
pfd.iLayerType = PFD_MAIN_PLANE;
pfd.bReserved = 0;
pfd.dwLayerMask = 0;
pfd.dwVisibleMask = 0;
pfd.dwDamageMask = 0;
pf = ChoosePixelFormat(Hdc, &pfd);
SetPixelFormat(Hdc, pf, &pfd);
Hglrc = wglCreateContext(Hdc);
wglMakeCurrent(Hdc, Hglrc);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
switch (message)
{
case WM_CREATE:
InitOpenGL(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
[COLOR="Red"]
BeginPaint(Hwnd, &ps);
Render();
EndPaint(Hwnd, &ps);
[/COLOR]
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
break;
}
return 0;
}
INT WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
INT nCmdShow)
{
WNDCLASSEX wcex;
MSG msg;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hbrBackground = NULL;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"ae";
wcex.hIconSm = NULL;
RegisterClassEx(&wcex);
Hwnd = CreateWindow(L"ae",
L"",
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(Hwnd, nCmdShow);
UpdateWindow(Hwnd);
ZeroMemory(&msg, sizeof(msg));
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
return (0);
}
Инициализация OpenGL
Привет всем, у меня возможно несколько глупый вопрос, почему окно не окрашивается в красный цвет если убрать выделенные строки?
Это единственный кусок кода, который делает хоть что-то существенное. Остальное - стандартное создание окошка, оконная функция и т.п. Ну и вызов стандартной процедуры инициализации OpenGL из DelphiWorld'а.
Чтобы понять, что и почему, прежде всего идем сюда - http://msdn.microsoft.com/en-us/library/dd145213(VS.85).aspx и разбираемся с WM_PAINT - сообщением о перерисовке окна.
Собственно у тебя перерисовка окна заключается в инициализации и завершении отрисовки, а - самое главное - в вызове процедуры Render, весь смысл которой в очистке буфера цвета и заполнения его красным. Соответственно, если ты убираешь эти строки - читай: убираешь отрисовку - разумеется у тебя ничего не рисуется.
Зы: прежде чем следующий раз задавать такие вопросы, потрудись немножко почитать все таки литературу и документацию с подмонтированным устройством /dev/head. То, что я сегодня слишком добрый - это случайность. :)
Вот собственно код, в котором добавлено постепенное окрашивание в красный цвет.
Код:
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
HWND Hwnd;
HGLRC Hglrc;
HDC Hdc;
float i = 0.0;
void Render()
{
i += 0.001;
glClearColor(i, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SwapBuffers(wglGetCurrentDC());
}
void InitOpenGL(HWND hwnd)
{
int pf;
PIXELFORMATDESCRIPTOR pfd;
Hdc = GetDC(hwnd);
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cRedBits = 8;
pfd.cRedShift = 16;
pfd.cGreenBits = 8;
pfd.cGreenShift = 8;
pfd.cBlueBits = 8;
pfd.cBlueShift = 0;
pfd.cAlphaBits = 0;
pfd.cAlphaShift = 0;
pfd.cAccumBits = 64;
pfd.cAccumRedBits = 16;
pfd.cAccumGreenBits = 16;
pfd.cAccumBlueBits = 16;
pfd.cAccumAlphaBits = 0;
pfd.cDepthBits = 32;
pfd.cStencilBits = 8;
pfd.cAuxBuffers = 0;
pfd.iLayerType = PFD_MAIN_PLANE;
pfd.bReserved = 0;
pfd.dwLayerMask = 0;
pfd.dwVisibleMask = 0;
pfd.dwDamageMask = 0;
pf = ChoosePixelFormat(Hdc, &pfd);
SetPixelFormat(Hdc, pf, &pfd);
Hglrc = wglCreateContext(Hdc);
wglMakeCurrent(Hdc, Hglrc);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
switch (message)
{
case WM_CREATE:
InitOpenGL(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
i = 0.0;
BeginPaint(Hwnd, &ps);
[COLOR="red"]Render();[/COLOR] Первый рендер
EndPaint(Hwnd, &ps);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
break;
}
return 0;
}
INT WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
INT nCmdShow)
{
WNDCLASSEX wcex;
MSG msg;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hbrBackground = NULL;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"ae";
wcex.hIconSm = NULL;
RegisterClassEx(&wcex);
Hwnd = CreateWindow(L"ae",
L"",
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(Hwnd, nCmdShow);
UpdateWindow(Hwnd);
ZeroMemory(&msg, sizeof(msg));
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
[COLOR="Red"]Render();[/COLOR] //второй рендер
}
}
return (0);
}
#include <gl/gl.h>
#include <gl/glu.h>
HWND Hwnd;
HGLRC Hglrc;
HDC Hdc;
float i = 0.0;
void Render()
{
i += 0.001;
glClearColor(i, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SwapBuffers(wglGetCurrentDC());
}
void InitOpenGL(HWND hwnd)
{
int pf;
PIXELFORMATDESCRIPTOR pfd;
Hdc = GetDC(hwnd);
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cRedBits = 8;
pfd.cRedShift = 16;
pfd.cGreenBits = 8;
pfd.cGreenShift = 8;
pfd.cBlueBits = 8;
pfd.cBlueShift = 0;
pfd.cAlphaBits = 0;
pfd.cAlphaShift = 0;
pfd.cAccumBits = 64;
pfd.cAccumRedBits = 16;
pfd.cAccumGreenBits = 16;
pfd.cAccumBlueBits = 16;
pfd.cAccumAlphaBits = 0;
pfd.cDepthBits = 32;
pfd.cStencilBits = 8;
pfd.cAuxBuffers = 0;
pfd.iLayerType = PFD_MAIN_PLANE;
pfd.bReserved = 0;
pfd.dwLayerMask = 0;
pfd.dwVisibleMask = 0;
pfd.dwDamageMask = 0;
pf = ChoosePixelFormat(Hdc, &pfd);
SetPixelFormat(Hdc, pf, &pfd);
Hglrc = wglCreateContext(Hdc);
wglMakeCurrent(Hdc, Hglrc);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
switch (message)
{
case WM_CREATE:
InitOpenGL(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
i = 0.0;
BeginPaint(Hwnd, &ps);
[COLOR="red"]Render();[/COLOR] Первый рендер
EndPaint(Hwnd, &ps);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
break;
}
return 0;
}
INT WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
INT nCmdShow)
{
WNDCLASSEX wcex;
MSG msg;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hbrBackground = NULL;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"ae";
wcex.hIconSm = NULL;
RegisterClassEx(&wcex);
Hwnd = CreateWindow(L"ae",
L"",
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(Hwnd, nCmdShow);
UpdateWindow(Hwnd);
ZeroMemory(&msg, sizeof(msg));
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
[COLOR="Red"]Render();[/COLOR] //второй рендер
}
}
return (0);
}
Цитата: 9l.
Спасибо конечно за доброту, но есть 2 места где вызывается Render(), это в сообщении WM_PAINT и в цикле обработки сообщений, в функции WinMain(), Render() который находиться в WM_PAINT вызывается только один раз(проверено в отладчике), а Render() в цикле обработки сообщений вызывается много раз, но если закомментировать первый Render() то второй не работает, т.е. он вызывается, но почему то не рисует.
Марш в MSDN. Сказал же - прочитайте хоть немного документации и посмотрите, где и когда можно рисовать
Модератор.
Мммм, извиняюсь конечно, но я всего лишь уточнил и не задевал/провоцировал на конфликт/грубил т.е. не троллил.
Цитата: 9l.
Мммм, извиняюсь конечно, но я всего лишь уточнил и не задевал/провоцировал на конфликт/грубил т.е. не троллил.
Это радует. Так и продолжайте. ;)