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ą).
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.
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);
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);
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