Ich glaube immer noch nicht, dass es hier eine klare Antwort gibt.Also hier ist, wie ich habe es durch eine 2D-Textur arbeiten:
// First, create a frame buffer:
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
// Then generate your texture and define an unsigned int array:
glGenTextures(1, &textureid);
glBindTexture(GL_TEXTURE_2D, textureid);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32UI, w, h, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
// Attach it to the frame buffer object:
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, textureid, 0);
// Before rendering
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLuint buffers[2] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }; // this assumes that there is another texture that is for the render buffer. Color attachment1 is preserved for the element ids.
glDrawBuffers(2, buffers);
// Clear and render here
glFlush(); // Flush after just in case
glBindFramebuffer(GL_FRAMEBUFFER, 0);
Auf der GLSL Seite sollte das Fragment-Shader (4.3 Kernprofil Code hier) haben:
layout(location = 0) out vec4 colorOut; // The first element in 'buffers' so location 0
layout(location = 1) out uvec4 elementID; // The second element in 'buffers' so location 1. unsigned int vector as color
// ...
void main()
{
//...
elementID = uvec4(elementid, 0, 0, 0); // Write the element id as integer to the red channel.
}
Sie können die Werte weiter lesen die Host-Seite:
unsigned int* ids = new unsigned int[ w*h ];
glBindTexture(GL_TEXTURE_2D, textureid);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, ids);
klingt gut - obwohl ich es mit GL_LUMINANCE16 Arbeit bekam bereits durch Dividieren meine ... für einige Gründe, warum ich in sie machen kann - vielleicht ist es nur meine Grafikkarte, die es unterstützt? Wenn ich das integrale Texturformat verwende, wie kann ich die int-Ausgabe für nur ein Renderziel definieren? Ich verwende 5 Farbanhänge in meinem Shader, die ersten 4 rendere andere Dinge in Fließkomma-Texturen, die 5. rendere die objectId. Es funktioniert jetzt (mit GL_LUMINANCE16), aber vielleicht verwende ich nur undefiniertes Verhalten? Ich habe einen OpenGL 4.2 Kontext – Mat
@Mat: Sie müssen die Ausgabe zu einem 'int' deklarieren, um auf' int' Ausgaben zu schreiben. Wenn man bedenkt, dass dies funktioniert, nehme ich an, dass Sie eine NVIDIA-Karte haben. –
ja ich habe eine nvidia-karte. aber wie kann ich eine einzelne Ausgabekomponente als int deklarieren? Ich habe die out-Variable von meinem fragmentshader deklariert als 'out vec4 out_colors [5] ' – Mat