2012-07-26 15 views
6

Próbuję przekonwertować mój program z GLfloat na GLshort dla pozycji wierzchołków i nie jestem pewien jak to reprezentować w module cieniującym. Używałem typu danych vec3 w module cieniującym, ale vec3 reprezentuje 3 obiekty pływające. Teraz muszę reprezentować 3 szorty. O ile mogę powiedzieć, że OpenGL nie ma wektora do szortów, więc co powinienem zrobić w tym przypadku?Używanie GLshort zamiast GLfloat dla wierzchołków

Odpowiedz

16

Nie jestem pewien, jak to przedstawić w module cieniującym.

Dzieje się tak dlatego, że ta informacja nie znajduje się w module cieniującym.

Wszystkie wartości podane przez glVertexAttribPointer będą przeliczone na wartości GLSL zmiennoprzecinkowe (jeśli nie są już pływające). Ta konwersja jest zasadniczo bezpłatna. Tak więc można użyć dowolnego z tych glVertexAttribPointer definicji z typem atrybutu vec4:

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, ...); 
glVertexAttribPointer(0, 4, GL_UNSIGNED_SHORT, GL_TRUE, ...); 
glVertexAttribPointer(0, 4, GL_SHORT, GL_TRUE, ...); 
glVertexAttribPointer(0, 4, GL_SHORT, GL_FALSE, ...); 

Wszystkie te zostaną przekształcone w vec4automatycznie. Twój moduł cieniujący nie musi wiedzieć ani nie obchodzi go, że jest zasilany szortami, bajtami, liczbami całkowitymi, pływakami itp.

Pierwsza z nich zostanie użyta w obecnej formie. Drugi konwertuje niepodpisany krótki zakres [0, 65535] na zakres [0,0, 1,0] zmiennoprzecinkowy. Trzeci zamieni podpisany krótki zakres [-32768, 32767] na zakres [-1,0, 1,0] (though the conversion is a bit odd and differs for certain OpenGL versions, so as to allow the integer 0 to map to the floating point 0.0). Czwarty konwertuje [-32768, 32767] na [-32768.0, 32767.0], jako zakres zmiennoprzecinkowy.

Typ GLSL, którego używasz do zmiany atrybutów, tylko wtedy, gdy używasz glVertexAttribIPointer lub glVertexAttribLPointer, z których żaden nie jest dostępny w OpenGL ES 2.0.

W skrócie: do atrybutów należy zawsze używać typów GLSL typu float. OpenGL wykona konwersję za Ciebie.

+0

Byłem pod wrażeniem, mogłem po przeczytaniu odpowiedzi na: http://stackoverflow.com/a/1316494/256062 i http://stackoverflow.com/a/5721102/256062 – Xavier

+0

@Xavier: You're brakuje punktu. Rozmiar twoich danych wierzchołków jest zdefiniowany przez 'glVertexAttribPointer', * nie * zmienną atrybutu GLSL. Nie * potrzebujesz * do reprezentowania mniejszych komponentów w module cieniującym; sprzęt * konwertuje * z mniejszych komponentów na większe. –

+0

@ nicol-bolas Dla podpisanych typów danych, czy na pewno przekonwertowany zakres jest na przykład (dla 'short')' [-32768, 32767] 'a nie' [-32767, 32767] '? Ten [artykuł] (http://www.informit.com/articles/article.aspx?p=2033340&seqNum=3), rzekomo zaczerpnięty z Pomarańczowej Księgi, wydaje się inaczej uczyć. Mówi ona, że ​​konwersja jest po prostu podziałem dla podpisanych typów. W takim przypadku krótka wartość "-32768" zostanie przekonwertowana na zmiennoprzecinkową wartość GLSL "-32768/32767 = -1000305185..". Nie mogę znaleźć w specyfikacji, gdzie określić, co jest poprawne. – wil

Powiązane problemy