在OpenGL中使用帧缓冲和着色器

6

关于帧缓冲区,我还有些困惑。我的目标是使用一个带有多个纹理附着的帧缓冲区,填充每个纹理,然后使用着色器将所有纹理合并(混合)以创建新的输出。听起来很容易?是的,这就是我想的,但我不太明白。

我该如何将当前绑定的纹理传递给着色器呢?

1个回答

9
您需要将纹理放入特定的槽中,然后使用采样器从中读取。在您的应用程序中:
GLuint frameBuffer;
glGenFramebuffersEXT(1, &frameBuffer); //Create a frame buffer
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frameBuffer); //Bind it so we draw to it
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, yourTexture, 0); //Attach yourTexture so drawing goes into it

//Draw here and it'll go into yourTexture.

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); //Unbind the framebuffer so that you can draw normally again

//Here we put the texture in slot 1.
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, yourTexture);
glActiveTexture(GL_TEXTURE0); //Don't forget to go back to GL_TEXTURE0 if you're going to do more drawing later

//Now we tell your shader where to look.
GLint var = glGetUniformLocationARB(yourShaderProgram, "yourSampler");
glUniform1i(var, 1); //We use 1 here because we used GL_TEXTURE1 to bind our texture

在你的片元着色器中:

uniform sampler2D yourSampler;

void main()
{
    gl_FragColor = texture2D(yourSampler, whateverCoordinatesYouWant);
}

您可以使用此方法与 GL_TEXTURE2 等一起来访问更多纹理。

并且我需要选择绘制缓冲区,对吧? 因此会有类似这样的代码: glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, yourTexture); //绘制 GLint var = glGetUniformLocationARB(yourShaderProgram, "yourSampler"); glUniform1i(var, 1); //我们使用1是因为我们使用GL_TEXTURE1来绑定纹理。 - Donny
3
你把两件完全不同的事情混淆了(即渲染到帧缓冲和从先前渲染的纹理中读取)。 - Christian Rau
我想做的是将渲染结果呈现到帧缓冲区,然后在着色器中使用该结果。这样做的想法是可以通过将多个不同的纹理都生成到帧缓冲区中来实现。最终我想要混合所有这些纹理。这种做法可行吗? - Donny
我已经编辑了我的答案,包括framebuffer部分。 - andyvn22
你能定义你的纹理吗? - Tyguy7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接