Ich versuche, mein Programm von GLfloat in GLshort für Vertexpositionen zu konvertieren, und ich bin mir nicht sicher, wie dies im Shader darzustellen ist. Ich benutzte einen Vec3-Datentyp im Shader, aber Vec3 repräsentiert 3 Floats. Jetzt muss ich 3 Shorts darstellen. Soweit ich weiß, hat OpenGL keinen Vektor für Shorts, also was soll ich in diesem Fall tun?Verwenden von GLshort anstelle von GLfloat für Scheitelpunkte
Antwort
Ich bin mir nicht sicher, wie dies im Shader darzustellen ist.
Das liegt daran, dass diese Informationen nicht im Shader leben.
Alle Werte, die von glVertexAttribPointer
bereitgestellt werden, werden konvertiert zu Floating-Point-GLSL-Werten (wenn sie nicht bereits Floats sind). Diese Umwandlung ist im Wesentlichen frei. So können Sie mit einem vec4
Attributtyp jeder dieser glVertexAttribPointer
Definitionen verwenden:
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, ...);
All dies wird in einem vec4
automatisch umgewandelt werden. Ihr Shader muss nicht wissen oder sich darum kümmern, dass er mit Kurzschlüssen, Bytes, Ganzzahlen, Schwimmern usw. gespeist wird.
Der erste wird unverändert verwendet. Die zweite konvertiert den vorzeichenlosen kurzen Bereich [0, 65535] in den Gleitkommabereich [0.0, 1.0]. Die dritte konvertiert den vorzeichenbehafteten Bereich [-32768, 32767] in den Bereich [-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). Der vierte konvertiert [-32768, 32767] in [-32768.0, 32767.0] als Gleitkommabereich. Der GLSL-Typ, den Sie für Attribute verwenden, wird nur geändert, wenn Sie glVertexAttribIPointer
oder glVertexAttribLPointer
verwenden, von denen keiner in OpenGL ES 2.0 verfügbar ist.
Kurz gesagt: Sie sollten immer float GLSL-Typen für Attribute verwenden. OpenGL übernimmt die Konvertierung für Sie.
- 1. GLubyte vs GLshort für Indizes
- 2. DREIjs Update-Scheitelpunkte von WireframeHelper
- 3. Verwenden von StructKeyExists anstelle von IsDefined
- 4. Was anstelle von org.jboss.resteasy.client.ClientRequest verwenden?
- 5. Verwenden von Methodenreferenz anstelle von Multiargument Lambda
- 6. Verwenden von Urlib anstelle von wget für Sitzungsauthentifizierung
- 7. Verwenden von Variable für imageNamed anstelle von fest codierten Zeichenfolge
- 8. Verwenden von MockitoJUnitRunner.class anstelle von SpringJUnit4ClassRunner.class
- 9. Verwenden von TypeDescriptor anstelle von TryParse
- 10. Verwenden von einer Schüsse anstelle von Drucktasten
- 11. Verwenden von CLOB anstelle von VARCHAR2
- 12. Verwenden von Zeichenfolgen anstelle von enums?
- 13. Verwenden von Objektliteral anstelle von Switch-Anweisung
- 14. Verwenden von Objekten anstelle von GET
- 15. Verwenden von QChecksum anstelle von Boost crc16
- 16. Verwenden von Text anstelle von Instanznamen von Klassen
- 17. Verwenden von anstelle von Trigger zum Konvertieren von Datentypen
- 18. Was kann ich anstelle von char.to_i verwenden?
- 19. So verwenden Sie anstelle von IsNull
- 20. Was anstelle von polymorphen Assoziationen zu verwenden?
- 21. Warum "[*]" anstelle von "[]" im Funktionsprototyp verwenden?
- 22. Web-Benutzersteuerelemente anstelle von Web Forms verwenden
- 23. Was soll ich anstelle von `qt5_use_modules` verwenden?
- 24. Warum rbegin() anstelle von end() - 1 verwenden?
- 25. Warum verwenden C++ - Programmierer! = Anstelle von <
- 26. Warum RDF anstelle von XML für das semantische Web verwenden
- 27. Verwenden Sie Cookie nur für Benutzersprache anstelle von Sitzung öffnen
- 28. Was anstelle von glGetAttribLocation für gl-Versionen verwenden <2.0
- 29. Warum verwenden Flux-Architekturbeispiele Konstanten für Aktionstypen anstelle von Strings?
- 30. Was anstelle von indexPath.row zu verwenden? für Nicht-Tabelle?
Ich war unter dem Eindruck, ich könnte nach dem Lesen der Antworten auf: http://Stackoverflow.com/a/1316494/256062 und http://Stackoverflow.com/a/5721102/256062 – Xavier
@ Xavier: Du bist am Thema vorbei. Die Größe Ihrer Vertex-Daten wird durch 'glVertexAttribPointer' definiert, * nicht * die GLSL-Attributvariable. Du brauchst * keine * kleineren Komponenten im Shader darzustellen; Die Hardware wird * von kleineren Komponenten in größere konvertieren. –
@ nicol-bolas Für signierte Datentypen, sind Sie sicher, dass der konvertierte Bereich zum Beispiel (für 'short')' [-32768, 32767] 'und nicht' [-32767, 32767] '' ist? Dieser [Artikel] (http://www.informit.com/articles/article.aspx?p=2033340&seqNum=3), angeblich aus dem Orange Book entnommen, scheint anders zu lehren. Es besagt, dass die Konvertierung nur eine Unterteilung für signierte Typen ist. In diesem Fall würde der Kurzwert "-32768" in den Gleitkomma-GLSL-Wert "-32768/32767 = -1.000305185.." umgewandelt werden. Ich kann nicht in der Spezifikation finden, wo zu bestimmen, was richtig ist. – wil