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
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 vec4
automatycznie. 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.
- 1. GLfloat lub GLDouble domyślnie?
- 2. Używanie wielu buforów wierzchołków w DX10/DX11
- 3. OpenGL: wymagana trwałość tablic wierzchołków
- 4. Obliczanie wierzchołków obróconego prostokąta
- 5. Używanie IObservable zamiast zdarzeń
- 6. Używanie intptr_t zamiast void *?
- 7. Używanie wtyczki zamiast identyfikatora
- 8. Używanie MockitoJUnitRunner.class zamiast SpringJUnit4ClassRunner.class
- 9. Używanie kasawy zamiast memcache?
- 10. Używanie współrzędnych geograficznych jako współrzędnych wierzchołków w pakiecie igraph r
- 11. Używanie '__progname' zamiast argv [0]
- 12. podstawowy openGL, bufory wierzchołków i pyglet
- 13. Obiekty wierzchołków wierzchołków - Zamieszanie dotyczące dokładnie informacji o stanie zapisanych na temat aktualnie powiązanego bufora wierzchołków
- 14. Używanie SQLDataReader zamiast zestawu rekordów
- 15. Używanie obiektu bloku zamiast selektora?
- 16. Używanie nieobsługiwanych wyjątków zamiast Contains()?
- 17. używanie przestrzeni nazw zamiast pojedynczych
- 18. Używanie innej tablicy dla wierzchołków i normałów w glDrawElements (OpenGL/VBO)
- 19. D3: Używanie atrybutu węzła dla łączy zamiast indeksu w tablicy
- 20. Używanie String.Replace() z indeksem zamiast łańcucha dla argumentu?
- 21. MPAndroidChart LineChart: Używanie dat zamiast ciągów dla osi X
- 22. Używanie "::" zamiast "modułu ..." do wyświetlania nazw Ruby
- 23. Używanie identyfikatorów UUID zamiast ObjectID w MongoDB
- 24. Modyfikowanie wierzchołków w obiekcie THREE.BufferGeometry
- 25. Używanie lambda zamiast obiektu funkcji, zła wydajność
- 26. Używanie getBean zamiast iniekcji metod wiosną
- 27. Używanie boost.python z make zamiast bjam
- 28. Algorytmy transformacji wierzchołków OpenGL ES 2.0
- 29. Optymalizacja wierzchołków dla animacji szkieletu w OpenGL ES
- 30. C++ - Używanie szablonów zamiast funkcji wirtualnych
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
@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. –
@ 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