在OpenGL中从渲染图像中读回纹理坐标?

时间:2014-02-27 03:41:45

标签: opengl textures

如果我在openGL中渲染一个场景,是否可以找回用于绘制该像素的纹理坐标?

例如,如果我渲染一个有3个顶点(x,y,z)和3个tex坐标(u,v)的三角形,然后我在三角形上选择一个像素,我就可以得到三角形的颜色和使用opengl调用的深度,但是是否也可以获得插值纹理坐标?

基本上,我想在用于在特定像素上绘制三角形的纹理上获取图像点。

我猜测唯一真正的方法是重建从摄像机中心穿过图像平面上的像素的光线,然后做一个光线三角形交叉点来确定它是哪个三角形,然后我可以查看我的纹理数组来获取三角形的纹理坐标,然后进行我自己的重心插值,但我想避免在可能的情况下完成所有这些操作。

编辑:我目前拥有的代码在下面的赏金请求中没有正确格式化,所以我把它放在这里。这就是我现在所拥有的,我想添加读取纹理坐标u,v,如果可能的话,理想情况下没有着色器程序。

    // First initialize the FBO, I am interested in depth and color

// create a framebuffer object
glGenFramebuffers(1, &id);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id);

// Create texture to store color info
glGenTextures(1, &color);
glBindTexture(GL_TEXTURE_2D, color);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,  width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, color, 0);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);

// Create render buffer to store depth info
glGenRenderbuffers(1, &depth);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);

// Attach the renderbuffer to depth attachment point
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

// Then later in the code, I use the actual buffer:

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
...
//draw model
...
//read color and depth values (want to also read texture coordinate values u and v here too)
...
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

2 个答案:

答案 0 :(得分:1)

将场景渲染为具有2通道浮点颜色附件(GL_RG32F或类似物)的FBO,并在片段着色器中将u / v坐标输出到该附件。

答案 1 :(得分:1)

如果您决定在不使用着色器的情况下执行此操作,则可以在不使用光照的情况下渲染场景,并为每个对象使用单个纹理。这个纹理将填充两个渐变。红色通道水平从0到255,绿色通道垂直从0到255。现在,您已使用纹理坐标有效地绘制了场景(假设它们在0-1范围内)。您可以使用glReadPixels读回刚刚渲染到的缓冲区(或缓冲区的一部分),并使用红色通道检索u,使用绿色通道检索v。