Todavía no creo que haya una respuesta clara aquí.Así que aquí es lo que me hizo trabajar a través de una textura 2D:
// 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);
En el lado GLSL el fragment shader debería tener (código de perfil 4.3 núcleo aquí):
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.
}
puedes leer los valores de el lado del host:
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);
suena bien - aunque lo tengo trabajando con GL_LUMINANCE16 ya dividiendo mi ... por algunas razones que pueden hacer que en él - tal vez es sólo mi tarjeta de gráficos compatible con él? Si utilizo el formato de textura integral, ¿cómo puedo definir la salida int para un solo objetivo de renderizado? Utilizo adjuntos de 5 colores en mi sombreador, los primeros 4 representan otras cosas con texturas de flotante flotantes, y el 5to renderiza el ID de objeto. funciona ahora (usando GL_LUMINANCE16) pero tal vez solo estoy usando un comportamiento indefinido? Tengo un contexto OpenGL 4.2 – Mat
@Mat: Debe declarar que la salida es 'int' para escribir en las salidas' int'. Además, teniendo en cuenta que esto funciona, supongo que tienes una tarjeta NVIDIA. –
sí, tengo una tarjeta nvidia. pero ¿cómo puedo declarar un único componente de salida como int? Tengo la variable de salida de mi fragmentshader declarada como 'out vec4 out_colors [5]' – Mat