如果我在 openGL 中渲染场景,是否可以取回用于绘制该像素的纹理坐标?
例如,如果我渲染一个具有 3 个顶点 (x,y,z) 和 3 个纹理坐标 (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);
最佳答案
如果您决定在不使用着色器的情况下执行此操作,则可以在不使用照明的情况下渲染场景,并为每个对象使用单个纹理。该纹理将填充两个渐变。红色 channel 水平方向从 0 到 255,绿色 channel 垂直方向从 0 到 255。现在您已经使用纹理坐标有效地绘制了场景(假设它们在 0-1 范围内)。您可以使用 glReadPixels
读回刚刚渲染到的缓冲区(或缓冲区的一部分),并使用红色 channel 检索 u 和绿色 channel 检索 v。
关于opengl - 从 OpenGL 渲染图像读回纹理坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22058559/