es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La función de textura OpenGL siempre devuelve 0 en datos enteros.

Estoy trabajando en un pipeline de shading deferred, y he guardado cierta información en una textura, y esta es la textura adjunta a mi gbuffer.

// objectID, drawID, primitiveID
glGenTextures(1, &_gPixelIDsTex);
glBindTexture(GL_TEXTURE_2D, _gPixelIDsTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32UI, _width, _height, 0, GL_RGB_INTEGER, GL_UNSIGNED_INT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Y así es como escribo IDs en ella:

// some other gbuffer textures...
layout (location = 4) out uvec3 gPixelIDs;

gPixelIDs = uvec3(objectID, drawID, gl_PrimitiveID + 1);

Después del paso de geometría, puedo leer de ella usando el siguiente código:

struct PixelIDs {
    GLuint ObjectID, DrawID, PrimitiveID;
}pixel;

glBindFramebuffer(GL_READ_FRAMEBUFFER, gBufferFBO);
glReadBuffer(GL_COLOR_ATTACHMENT4);
glReadPixels(x, y, 1, 1, GL_RGB_INTEGER, GL_UNSIGNED_INT, &pixel);
glReadBuffer(GL_NONE);
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);

Hasta aquí todo bien. La salida es lo que necesito.

Pero cuando intento usar este shader para mostrar la ID del objeto en pantalla (solo para fines de depuración)

uniform sampler2D gPixelIDsTex;

uint objID = uint(texture(gPixelIDsTex, fragData.TexCoords).r);
FragColor = vec4(objID, objID, objID, 1);

el resultado es 0 (usé Snipaste para leer el color del píxel), lo que significa que no puedo usar los datos en mi proceso posterior.

Otras texturas de gbuffer con formato de datos en punto flotante (por ejemplo, vec4) funcionan bien, así que no sé por qué texture siempre devuelve 0 en esta.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basándonos en el código y la información proporcionada, parece que el problema puede estar relacionado con el formato y el tipo de textura utilizado para almacenar los IDs en la textura. El código utiliza el formato GL_RGB32UI (entero sin signo de 32 bits) y el tipo GL_UNSIGNED_INT para la textura, mientras que los shaders de lectura y visualización utilizan GL_RGB_INTEGER y GL_UNSIGNED_INT para leer y muestrear la textura.

    Una solución potencial es utilizar el mismo formato y tipo de textura tanto para crearla como para muestrearla. Por ejemplo, cambiar el formato de la textura a GL_RGBA32UI y los shaders de lectura y visualización para que utilicen GL_RGBA_INTEGER y GL_UNSIGNED_INT para leer y muestrear la textura.

    Alternativamente, podría ser un problema con las coordenadas de textura utilizadas al muestrear la textura en el shader de visualización. Verificar las coordenadas de textura y asegurarse de que estén dentro del rango de [0, 1] también puede ayudar a resolver el problema.

    En general, puede requerir algo de prueba y error para reducir la causa raíz del problema y encontrar una solución adecuada.

Comments are closed.