Witam wszystkich!
Na początku wrzucę fragment kodu, który używam do inicjalizacji OpenGL'a w moim programie.
bool GLApplication::InitOpenGL(void)
{
int iFormat = 0;
HGLRC m_tempContext;
PIXELFORMATDESCRIPTOR pfd;
ZeroMemory(&pfd, sizeof(pfd));
pfd = {sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,
32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 8, 0, PFD_MAIN_PLANE, 0, 0, 0, 0};
m_DeviceContext = GetDC(m_WindowHandle);
iFormat = ChoosePixelFormat(m_DeviceContext, &pfd);
SetPixelFormat(m_DeviceContext, iFormat, &pfd);
m_tempContext = wglCreateContext(m_DeviceContext);
wglMakeCurrent(m_DeviceContext, m_tempContext);
GLenum error = glewInit();
if (error != GLEW_OK)
{
MessageBox(NULL, "GLEW Initialization Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return false;
}
int attribs[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, 1,
WGL_CONTEXT_MINOR_VERSION_ARB, 0,
WGL_CONTEXT_FLAGS_ARB, 0,
0
};
if (wglewIsSupported("WGL_ARB_create_context") == 1)
{
m_RenderContext = wglCreateContextAttribsARB(m_DeviceContext, 0, attribs);
if (m_RenderContext == NULL)
{
MessageBox(NULL, "wglCreateContextAttribsARB Failed!", "Error!", MB_ICONINFORMATION | MB_OK);
}
wglMakeCurrent(NULL, NULL);
wglDeleteContext(m_tempContext);
}
else
{
m_RenderContext = m_tempContext;
}
wglMakeCurrent(m_DeviceContext, m_RenderContext);
const GLubyte* Version = glGetString(GL_VERSION);
MessageBox(NULL, (LPCSTR)Version, "OpenGL Version Info", MB_ICONINFORMATION | MB_OK);
return true;
}
Problem, z którym się zmagam polega na tym, że chcę dokładnie sprecyzować wersję OpenGL'a którą moja aplikacja będzie używać. Domyślnie w moim systemie najwyższa wersja to 4.5. Jeżeli jednak będę chciał powiedzmy użyć konkretnie wersji np. 3.2 to wtedy zaczynają się schody. Kiedy zmieniam odpowiednie parametry w tablicy attribs, która odpowiada za ustawienie wersji OpenGL to niestety nic nie wyświetla się w oknie aplikacji.
int attribs[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 2,
WGL_CONTEXT_FLAGS_ARB, 0,
0
};
Jeżeli zaś użyję wersji 3.1 (WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 1,) to wszystko nagle zaczyna magicznie działać. Tak samo jest w przypadku, gdy chcę użyć wersji 1.0. Aplikacja korzysta wtedy zgodnie ze standardem z najwyższej możliwej wersji GL'a, czyli u mnie 4.5. Jeżeli jednak chcę ustawić wersję 4.5 na sztywno w programie to znowu cały ekran aplikacji jest czarny. Czy ktoś może mi wytłumaczyć to dziwne dla mnie zachowanie GL'a?
Kod używany do renderowania:
bool GLTEST::ProcessApplicationGraphics(float dt)
{
static float theta = 0.0f;
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(-theta, 0.0f, 0.0f, 1.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.1f, -0.1f);
glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.1f, -0.1f);
glEnd();
glPopMatrix();
SwapBuffers(m_DeviceContext);
theta += 45.0f * dt;
return true;
}