2013-06-13 16 views
9

Nach http://www.opengl.org/sdk/docs/man/xhtml/glFramebufferTexture.xml, sollte ein Aufruf an glFramebufferTexture wie folgt aussehen:Was ist der Punkt des textarget-Parameters für glFramebufferTexture?

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);

Wenn die API bereits die textureId weiß, warum braucht man es das Ziel (GL_TEXTURE_2D) wissen? Bedeutet dies, dass die Textur vor diesem Aufruf gebunden sein sollte? d.h. muss ich anrufen:

glBindTexture(GL_TEXTURE_2D, textureId); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

Oder wird glFramebufferTexture2D alles behandeln?

Antwort

13

Es ist wegen der Dummheit da.

Siehe, die Art und Weise, wie Sie eine face of a cubemap an einen FBO anfügen, ist die Verwendung eines der Cubemap-Gesichtstexturziele. Wenn Sie also das + X-Gesicht einer Cubemap binden möchten, verwenden Sie das Ziel GL_TEXTURE_CUBE_MAP_POSITIVE_X​. Das Bindungsziel der Textur (wenn Sie es binden würden) wäre GL_TEXTURE_CUBE_MAP, aber das ist nicht was Sie an textarget übergeben, wenn Sie ein Gesicht an einen FBO befestigen möchten.

Das ist blöd, weil OpenGL auch die glFramebufferTextureLayer Funktion bereitstellt, die keinen textarget Parameter benötigt. Es identifiziert den Typ der Textur genau anhand des Objekts. Es funktioniert auf 3D-Textur, 1D und 2D-Arrays und sogar cubemap array textures. Aber funktioniert nicht auf Nicht-Array-Cubemaps; Sie müssen immer noch den dummen glFramebufferTexture2D mit seinem albernen textarget Parameter verwenden.

Die einzigen Funktionen, die Sie verwenden sollten, sind glFramebufferTextureLayer und glFramebufferTexture. Aber weil glFramebufferTextureLayer nicht auf Nicht-Array-Cubemap-Flächen funktioniert, müssen Sie glFramebufferTexture2D für Flächen einer Nicht-Array-Cubemap verwenden.


Dank ARB_direct_state_access (und damit OpenGL 4.5), diese Idiotie nicht mehr gilt. glFramebufferTextureLayer kann jetzt auf Nicht-Array-Cubemap-Flächen verwendet werden, sodass jetzt keine der dimensionsbasierten FramebufferTexture-Funktionen mehr benötigt wird. Und deshalb kein Punkt zu textarget.

+0

Also sagst du, ich sollte aufhören, 'glFramebufferTexture2D' zu verwenden und stattdessen' glFramebufferTextureLayer' zu verwenden? Und ich brauche mir keine Gedanken darüber zu machen, ob ich die Textur vor und nach den Anrufen binden soll. –

+0

@MarkIngram: Ich habe den letzten Satz geändert, um es klarer zu machen. Und meine Erklärung, warum das Ziel dort ist, sollte klarstellen, dass du die Textur nicht binden musst; Ich habe keine Ahnung, wie Sie diese Idee überhaupt bekommen haben. –

+1

Danke Nicol, ich verwende eine Textur als Ausgabe einer GPGPU-Operation, also werde ich es nicht mit Cubemaps zu tun haben. Ich habe die Idee von einem Beispiel-Apple-Code, aber es könnte sein, dass sie nur die Textur nicht gelöst haben, wenn sie damit fertig waren. –

Verwandte Themen