我正在使用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()。
答案 0 :(得分:1)
如果您的着色器中确实有“uniform sampler 2D 'myTexture'
”,为什么要获得“Map”的统一位置?您应该获得“myTexture”的统一位置;毕竟那是采样器的名字。
答案 1 :(得分: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);