帧缓冲区和在opengl中使用着色器

Posted

技术标签:

【中文标题】帧缓冲区和在opengl中使用着色器【英文标题】:framebuffer and using shaders in opengl 【发布时间】:2011-09-09 05:50:20 【问题描述】:

我对帧缓冲区有点困惑。我想要做的是使用附加了多个纹理的帧缓冲区,填充每个纹理,然后使用着色器组合(混合)所有纹理以创建新输出。听起来很容易?是的,我也是这么想的,但我不明白。

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

【问题讨论】:

【参考方案1】:

您需要将纹理放在特定插槽中,然后使用采样器从中读取。在您的应用中:

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 您正在混合两种完全不同的东西(即渲染到帧缓冲区并从先前渲染的纹理中读取)。 我要做的是渲染到帧缓冲区,然后将结果放入着色器。这个想法是,我可以通过渲染到帧缓冲区来生成许多不同的纹理。结果我想混合所有这些纹理。这可能吗? 我已经编辑了我的答案以包括帧缓冲区部分。 你能定义你的纹理吗?

以上是关于帧缓冲区和在opengl中使用着色器的主要内容,如果未能解决你的问题,请参考以下文章

打开 gl 计算着色器和帧缓冲区

OpenGL 帧缓冲区颜色附件到计算着色器

用于片段着色器的 OpenGL GLSL 绑定采样器

在OpenGL中绘制到半透明帧缓冲区时如何抗锯齿? [复制]

Opengl 和 Webgl:从附加到当前帧缓冲区的纹理中采样

Android OpenGLES3绘图 - 帧缓冲