【发布时间】:2014-11-30 18:50:57
【问题描述】:
我想在我的 FBO 中加载两个纹理,一个纹理包含一个 HDR 图像,我的第一个目标是将图像从第一个纹理“复制”到第二个(它是空的),并调用 'DownSamplingTex'。
于是我创建了FBO,在COLOR_ATTACHMENT_0中加载我想写的纹理,并绑定它;然后初始化我的着色器程序并渲染一个四边形,我想在 GL_TEXTURE_0 中读取纹理。
然后我解绑FBO并绑定'DownSamplingTex',然后画一个四边形。
不知道流程是否正确,我的输出是黑屏。
这是渲染代码:
glBindFramebuffer(GL_FRAMEBUFFER, fboA);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
FBOtex->bind(); // Set read texture bound in GL_TEXTURE_0
glDrawBuffer(GL_COLOR_ATTACHMENT0); // draw to write texture (DownSamplingTex)
fboShad->bind(); // use program of FBO shader
fboShad->setUniformValue4f("MVP", glm::value_ptr(MVP)); // Shader attribute
drawQuad(); // Draw
fboShad->unbind();
FBOtex->unbind();
// Main FB rendering
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
fboShad->bind();
fboShad->setUniformValue4f("MVP", glm::value_ptr(MVP));
DownSamplingTex->bind();
drawQuad();
DownSamplingTex->unbind();
fboShad->unbind();
顶点着色器:
#version 420
in vec4 vUV;
in vec4 vVertex;
smooth out vec2 vTexCoord;
uniform mat4 MVP;
void main()
{
vTexCoord = vUV;
gl_Position = MVP*vVertex;
}
片段着色器:
#version 420
smooth in vec2 vTexCoord;
layout(location = 0) out vec4 color;
layout(binding=0) uniform sampler2D texHDR;
void main(void)
{
color = texture(texHDR,vTexCoord);
}
在 'drawQuad()' 中,我使用 glGetAttribLocation() 和 glVertexAttribPointer() 设置 vVertex 值。
std::vector<GLfloat> quadVerts = {
-1, -1, 0, 0, 1,
-1, 1, 0, 0, 0,
1, 1, 0, 1, 0,
-1, -1, 0, 0, 1,
1, 1, 0, 2, 0,
1, -1, 0, 1, 1 };
GLuint quadVbo;
glGenBuffers(1, &quadVbo);
glBindBuffer(GL_ARRAY_BUFFER, quadVbo);
glBufferData(GL_ARRAY_BUFFER, 6*3*4, &quadVerts[0], GL_STATIC_DRAW);
GLuint vVertex = fboShad->getLocation("vVertex");
GLuint vUV = fboShad->getLocation("vUV");
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 3 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(vVertex);
glVertexAttribPointer(vVertex, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, 0);
glEnableVertexAttribArray(vUV);
glVertexAttribPointer(vUV, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (void*)(3 * sizeof(GLfloat)));
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(vVertex);
glDisableVertexAttribArray(vUV);
我不知道错误是在处理过程中,还是在片段着色器中使用属性不正确(我想'layout(binding=1)',如果你使用 FBO 绑定的着色器,采用 GL_COLOR_ATTACHMENT_1 纹理);或使用“vTexCoords”作为顶点的 .xy 值。
【问题讨论】:
-
如果片段着色器只写入一个输出,为什么会有两个颜色附件?由于没有对
glBindFragDataLocation (...)的调用,我将假设在这种情况下仅写入附件GL_COLOR_ATTACHMENT0。 事实上,您现在编写的片段着色器甚至不应该编译,因为color未定义。 -
是的,对不起,评论那行是我的错,修复了那个错误。
-
我的想法是将两个纹理加载到片段着色器中,但只写入下采样tex,使用另一个纹理,其中包含图像并附加到
GL_COLOR_ATTACHMENT_1
标签: opengl glsl shader fbo render-to-texture