0

我正在使用openGL,我想做的是将我的场景渲染为纹理,然后存储该纹理,以便我可以将它传递到我的片段着色器中以用于渲染其他内容。

我使用 glGenTexture() 创建了一个纹理并将其附加到帧缓冲区,然后使用 glBindFrameBuffer() 渲染帧缓冲区。然后我将帧缓冲区设置回 0 以渲染回屏幕,但现在我被卡住了。

在我的片段着色器中,我有一个统一的采样器 2D 'myTexture',我想用它来存储纹理。我该怎么做呢?

对于我在网上找到的 .jpg/png 图像,我只使用了以下代码:

glUseProgram(Shader->GetProgramID());
GLint ID = glGetUniformLocation(
              Shader->GetProgramID(), "Map");
glUniform1i(ID, 0);
glActiveTexture(GL_TEXTURE0);
MapImage->Bind();
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

但是,此代码不适用于我创建的 glTexture。具体来说,我不能以同样的方式调用 myTexture->Bind() 。

4

2 回答 2

1

如果您uniform sampler 2D 'myTexture'的着色器中确实有“a”,为什么要获得“Map”的统一位置?您应该获得“myTexture”的统一位置;毕竟,这是采样器的名字。

于 2013-02-04T22:58:38.747 回答
0

所以我使用 glGenTexture() 创建了一个纹理并将其附加到帧缓冲区

所以换句话说,你这样做了:

glActiveTexture(GL_TEXTURE0);
GLuint myTexture;
glGenTextures(1, &myTexture);
glBindTexture(GL_TEXTURE_2D, myTexture);

// very important and often missed by newbies:
// A framebuffer attachment must be initialized but not bound
// when using the framebuffer, so it must be unbound after
// initializing
glTexImage2D(…, NULL);
glBindTexture(GL_TEXTURE_2D, 0);

glBindFramebuffer(…);
glFramebufferTexture2D(…, myTexture, …);

好的,所以 myTexture 是纹理的名称句柄。我们该做什么?解绑FBO,这样我们就可以使用附加的纹理作为图像源了,所以:

glBindFrameuffer(…, 0);

glActiveTexture(GL_TEXTURE0 + n);
glBindTexture(GL_TEXTURE_2D, myTexture);

glUseProgram(…);
glUniformi(texture_sampler_location, n);
于 2013-02-04T22:58:31.223 回答