Używanie konkretnej wersji OpenGL a czasami działający rendering

0

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;
}
0

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

Tylko po co? Ta 4.5 która ci się włącza to i tak jest "compatibility context", więc wszystko z 1.0 będzie działać.

Podejrzewam że jak chcesz wymusić konkretną wersję (z tych nowszych), a nadal używać fixed-pipeline, trzeba to wyraźnie podać w atrybutach (atrybut WGL_CONTEXT_PROFILE_MASK_ARB ustawić na WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB).

Poza tym wiedz, że wymuszenie konkretnej wersji daje ci taką wersję albo nowszą, o ile ta nowsza jest w 100% kompatybilna z żądaną. Więc równie dobrze może ci zwrócić 4.5, czyli tak samo, jakbyś nic nie kombinował.

0

Z tym że ustawienie:

 	int attribs[] =
	{
		WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
		WGL_CONTEXT_MINOR_VERSION_ARB, 2,
		WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
		WGL_CONTEXT_FLAGS_ARB, 0,
		0
	};

dalej powoduje odpalenie się wersji 4.5. Rozumiem że w tym wypadku dalej jest to tryb "compatibility context"?

Rozumiem, że jeżeli chciałbym ustawić dajmy na to WGL_CONTEXT_CORE_PROFILE_BIT_ARB to żeby wszystko się dobrze wyświetlało musiałbym do programu zapiąć odpowiednie shadery. Czy dobrze myślę?

0

dalej powoduje odpalenie się wersji 4.5.
No tak jak napisałem: może ci zwrócić wersję nowszą niż żądana, pod warunkiem że będzie zachowana kompatybilność.

Rozumiem że w tym wypadku dalej jest to tryb "compatibility context"?
Tak.

Rozumiem, że jeżeli chciałbym ustawić dajmy na to WGL_CONTEXT_CORE_PROFILE_BIT_ARB to żeby wszystko się dobrze wyświetlało musiałbym do programu zapiąć odpowiednie shadery. Czy dobrze myślę?

Tak.

1
Wazka260196 napisał(a):

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ć.

core profile wszedł w wersji 3.1, wersja 3.2 wprowadziła sporo restrykcji, np. wymusza użycie VAO więc musisz zdecydować czy piszesz z użyciem fixed pipeline czy nie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1