使用自定义着色器在全屏四边形上从 QGLFramebufferObject 绘制纹理
Draw texture from QGLFramebufferObject on full screen quad using custom shader
QT 4.7 和 QGLWidget,我想使用 QGLWidget::p aintGL() 将场景渲染到 QGLFramebufferObject 中,然后使用 QGLFramebufferObject 生成的纹理将场景渲染到屏幕上。对于第二步,我使用正交投影渲染一个全屏四边形,并使用自己的着色器将纹理渲染到其上。
渲染到 QGLFramebufferObject似乎工作正常(至少我可以调用 QGLFramebufferObject::toImage().save(文件名),我得到了正确渲染的图像),但我无法将渲染的纹理绘制到屏幕上。
这里我用来渲染到帧缓冲对象的代码:
//Draw into framebufferobject
_fbo->bind();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
_camera->applyModelviewMatrix();
_scene->glDraw();
glFlush();
_fbo->release();
_fbo->toImage().save("image.jpg");
如前所述,此处保存的图像包含正确渲染的图像。
在这里,我尝试将帧缓冲对象渲染到屏幕上的代码。我正在使用自己的着色器来渲染它。
//Draw framebufferobject to a full-screen quad on the screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
_selectionShader->bind();
glBindTexture(GL_TEXTURE_2D, _fbo->texture());
_selectionShader->setUniformValue("renderedTexture", _fbo->texture());
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);
glVertex3f(0.0f,0.0f,0.0f);
glTexCoord2f(1.0,0.0);
glVertex3f(1.0f,0.0f,0.0f);
glTexCoord2f(1.0,1.0);
glVertex3f(1.0f,1.0f,0.0f);
glTexCoord2f(0.0,1.0);
glVertex3f(0.0f,1.0f,0.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
glFlush();
}
顶点着色器只是通过它用作纹理坐标的位置
varying vec2 position;
void main()
{
gl_Position = ftransform();
position = gl_Vertex.xy;
}
片段着色器绘制纹理
varying vec2 position;
uniform sampler2D renderedTexture;
void main()
{
gl_FragColor = texture2D(renderedTexture, position);
}
我正在做的投影是正确的,因为当我将片段着色器与以下着色器交换时,它会绘制预期的颜色渐变:
varying vec2 position;
uniform sampler2D renderedTexture;
void main()
{
gl_FragColor = vec4(position.x, 0.0f, position.y, 1.0f);
}
但是使用另一个应该渲染纹理的片段着色器,我只得到一个空白屏幕(在渲染开始时由 glClear() 设为空白)。因此,片段着色器似乎要么绘制黑色,要么什么都不绘制。
我错过了什么吗?我是否将纹理正确传递给着色器?我还需要做其他事情来准备纹理吗?
_selectionShader->setUniformValue("renderedTexture", _fbo->texture());
这是(或)错误的部分。着色器中的采样器制服不是设置为纹理对象,而是设置为该对象作为纹理绑定到的纹理单元(您已经使用 glBindTexture(GL_TEXTURE_2D, _fbo->texture()
这样做了)。因此,由于您似乎一直在使用GL_TEXTURE0
,因此只需将其设置为纹理单位0
:
_selectionShader->setUniformValue("renderedTexture", 0);
顺便说一句,无需glEnable(GL_TEXTURE_2D)
,这在使用着色器时不是必需的。如果您只是使用顶点位置作为纹理坐标,为什么要使用glTexCoord2f
呢?
- 四边形的 2D 旋转
- OpenGL将纹理四边形渲染为(0,0)
- 如何使用着色器在 opengl es 中渲染四边形内部的部分纹理
- 将Pixeldata渲染到OpenGL纹理四边形中
- 使用四边形绘制球体的算法
- 将多个纹理 OpenGL 绑定到不同的四边形
- 四边形的面积
- 计算三角形与四边形的TBN矩阵的差异?
- Directx 11:重建三角形以支持四边形
- 使用顶点阵列、四边形阵列来创建四边形网格
- 计算两个四边形的交点的方法
- OpenGL:从数据阵列生成2D纹理以显示在四边形上
- 四边形无法正确生成?
- 在 OpenGL 中将四边形堆叠在一起
- GLSL着色:整个屏幕都是彩色的,而不仅仅是一个四边形
- Opengl/glsl 尝试编写用于绘制四边形的着色器,但不确定如何处理屏幕纵横比的变化
- 四边形 OpenGL 之间的碰撞检测
- 使用自定义着色器在全屏四边形上从 QGLFramebufferObject 绘制纹理
- 在几何着色器中旋转四边形
- HLSL 几何着色器四边形正在移动