Jak uzyskać modelview i matryce projekcyjne w OpenGL?

Próbuję użyć języka cieniowania OpenGL (GLSL) w wersji 1.5 do tworzenia shaderów wierzchołków i geometrii.

Dowiedziałem się, że w GLSL Wersja 1.5, wbudowane zmienne, takie jak gl_ModelViewProjectionMatrix są przestarzałe, więc trzeba je przekazać ręcznie. Jeśli ustawiłem już macierze modelview i projection (na przykład za pomocą gluLookAt i gluPerspective), to jak sprawić, by macierze przeszły do shaderów wierzchołków i geometrii? Zrobiłem kilka wyszukiwania i niektóre strony wydają się wspominać o function glGetMatrix(), ale nie mogę znaleźć tej funkcji w żadnej oficjalnej dokumentacji i wydaje się, że nie istnieje ona w implementacji, której używam (dostaję błąd kompilacji unknown identifier: glGetMatrix Kiedy próbuję ją skompilować z tą funkcją).

 27
Author: qdii, 2010-11-17

3 answers

Hej, zwolnijmy trochę tutaj:) tak, to prawda, że otrzymujesz matrycę przez glGetFloatv(GL_MODELVIEW_MATRIX, ptr)... ale to zdecydowanie nie jest rzecz, którą powinieneś tutaj robić!

Pozwól mi wyjaśnić:

W GLSL, wbudowane zmienne jak gl_ModelViewProjectionMatrix lub funkcje jak ftransform() są przestarzałe - to prawda, ale to tylko dlatego, że cały stos macierzy jest przestarzały w GL 3.x i powinieneś używać własnego stosu macierzy (lub użyć innego rozwiązania, stos macierzy jest pomocny, ale nie jest obowiązkowo!).

Jeśli nadal używasz stosu matrix, to polegasz na funkcjonalności z OpenGL 2.x lub 1.x. to jest w porządku, ponieważ wszystko to jest nadal obsługiwane na nowoczesnych kartach graficznych ze względu na profil kompatybilności GL - dobrze jest przełączyć się na nową wersję GL, ale na razie możesz z tym zostać.

Ale Jeśli używasz starszej wersji OpenGL( ze stosem macierzy), użyj również starszej wersji GLSL. spróbuj 1.2, ponieważ wyższe wersje (w tym Twój 1.5) są zaprojektowane tak, aby były kompatybilne z OpenGL3, gdzie takie rzeczy jak projection lub modelview nie istnieją już w OpenGL i oczekuje się, że będą przekazywane jawnie jako niestandardowe, zdefiniowane przez użytkownika zmienne uniform w razie potrzeby.

Korespondencja pomiędzy wersjami OpenGL i GLSL była kiedyś nieco skomplikowana (zanim wyczyścili numerację wersji, aby dopasować), ale powinna być mniej więcej podobna do:

GL    GLSL

4.1 - 4.1
4.0 - 4.0
3.3 - 3.3
3.2 - 1.5
3.1 - 1.4
3.0 - 1.3
2.x and lower - 1.2 and lower

Krótko mówiąc-mundury Shader ' a są przestarzałe, ponieważ odpowiednia funkcjonalność w OpenGL jest również przestarzała; albo przejdź do wyższej wersji OpenGL lub niższej wersji GLSL.

 59
Author: Kos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-17 10:54:33

Aby uzyskać macierz należy użyć stałych GL_MODELVIEW_MATRIX lub GL_PROJECTION_MATRIX z glGetxxxx:

GLfloat model[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, model); 
 11
Author: ergosys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-17 08:02:05
float modelview[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
 2
Author: Andreas Brinck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-17 08:04:32