2012-04-07 16 views
5

Estoy intentando muestrear una textura entera de mi sombreador de geometría ejecutándose en una GeForce 330m. Parece devolver otros valores de los que cargué en la textura. Yo uso este código (básicamente) para crear y cargar la textura:Opengl Geometry shader La búsqueda de textura de entero falla

glGenTextures(1, &textureId); 
glBindTexture(GL_TEXTURE_2D, textureId); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindTexture(GL_TEXTURE_2D, textureId); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_INT, <some 0-initialized large enough buffer>); 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindTexture(GL_TEXTURE_2D, textureId); 
    int data[] = { 3, 0, 36, 400 }; 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 3, 1, 1, GL_RGBA, GL_INT, data); 
glBindTexture(GL_TEXTURE_2D, 0); 

La idea es que un píxel en concreto se fija para tener un valor w de 400. Luego utilizo esto en mi shader de geometría:

#version 330 
#extension GL_EXT_gpu_shader4 : require 
uniform isampler2D models; 

void main() 
{ 
    ivec4 modelstats4 = texelFetch2D(models, ivec2(0, 3), 0); 
// ivec4 modelstats4 = ivec4(3, 0, 36, 400); 
    if (modelstats4.w > height) { 
     // emit something 
    } 
} 

El uso de los valores fijos comentados que deben ser iguales da como resultado algo que se emite (es decir, un punto). Si utilizo la búsqueda real de texel, no devuelve nada. Todos los valores que conozco que pueden tener un impacto ahora están codificados, así que no entiendo por qué esto no funciona. Este no es el código completo (configuración de OO, hay mucho que mirar) pero estas son las llamadas de OpenGL relevantes con los datos aplicables.

+0

Debe responder a su pregunta o eliminarla. Porque solo mantiene el lugar en la lista de preguntas sin respuesta :) – kravemir

+0

Gracias Miro, no lo sabía. – dascandy

Respuesta

4

Encontré la solución mediante la aspersión liberal de glGetErrors. El error estaba en cada glTexImage en este ejemplo de código, aparentemente, para una textura entera no debe usar GL_RGBA sino GL_RGBA_INTEGER.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA_INTEGER, GL_INT, data); 

Esto ahora funciona. Las recuperaciones de textura también son correctas.