2017-09-09 3 views
-1

Ich bin wirklich verwirrt mit allen Typ-Formate in OpenGL. Ich würde im Wesentlichen gerne eine Textur erstellen, die ich integers schreiben kann, und lesen Sie auch ganze Zahlen aus. Ich habe folgendes versucht:Wie schreibe ich Integer in einen Textur-Puffer in OpenGL

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, bufferRes.x, bufferRes.y, 0, GL_RED, GL_INT, NULL); 

Das gibt mir einen "UNGÜLTIGEN BETRIEB" -Fehler. Wenn ich GL_R32I zu GL_RED ändere, erhalte ich diesen Fehler nicht. Aber ist nicht GL_R32I das richtige Format? Wenn nicht, wofür ist das?

Auch, wenn ich diese Textur im Shader als Schwimmer lesen wollte, weiß ich, dass ein anderen Fall in dem ich 16-Bit-Integer verwenden ich getan habe:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16_SNORM, width, height, 0, GL_RED, GL_SHORT, NULL) 

Und dies war der richtige Weg, es zu tun . Aber es gibt keine GL_R32_SNORM. Ich bin wirklich verwirrt mit all diesen, weil ich mich erinnere, GL_R16I funktioniert, aber GL_R32I ist nicht.

+0

Was ist Ihre Hardware? Wahrscheinlich unterstützt Ihre Hardware das interne Format 'GL_R32I' nicht. – Rabbid76

+0

@Rabbid Es unterstützt es, stellt sich heraus, ich hatte das falsche Format für das 7. Argument, sollte GL_RED_INTEGER anstelle von GL_RED gewesen sein. Ich habe eine Antwort hinzugefügt, wenn es irgendjemandem hilft. – Zebrafish

Antwort

0

Da diese Frage wieder geöffnet wurde, und da ich gefunden habe, was das Problem war, kann ich den Fehler auch erklären. Der Fehler ist, dass in dieser Zeile:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, width, height, 0, GL_RED, GL_INT, NULL); 

GL_REDGL_RED_INTEGER sein sollte. Ich fand diese Lösung in der Antwort von Nicol Bolas in der Verbindung zu der doppelten Frage, als diese geschlossen wurde.

OpenGL 2 Texture Internal Formats GL_RGB8I, GL_RGB32UI, etc

Obwohl diese Frage beschäftigt sich mit GL_RGB32UI und nicht GL_R32I wie in meinem Fall war das Problem im Wesentlichen die gleichen, die _INTEGER Suffix für das siebte Argument fehlt.

Dies ist aus dem OpenGL Wiki, auch in dem Duplikat Frage verknüpft:

... Für ganzzahlige Pixeltypen bedeutet ein Gleitkommaformat verwendet, dass die Pixel normalisiert werden angenommen wird ganze Zahlen. Und so werden sie als normalisierte Werte interpretiert.

Wenn Sie ganzzahlige Daten in ein integriertes Bildformat übertragen möchten, müssen Sie das Pixelformat mit "_INTEGER" suffixen ( ). Dies besagt, dass die clientseitigen Pixeldaten Integer und nicht Fließkomma sind. Sie sollten nur das Formatformat "_INTEGER" mit integriertem Bild Formate verwenden.

In Bezug auf die Frage, warum das Format GL_R32_SNORM nicht existiert, während GL_R16_SNORM tut, wurde mir gesagt, dass es beim Lesen von 32-Bit-Integer als normierte einfacher Genauigkeit schwebt wie der Verlust an Präzision keinen Punkt wäre würde Sei ziemlich groß. Danke an Nicol und denhass, dass sie mir geholfen haben.