- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 QT 4.7 和 QGLWidget,我想使用 QGLWidget::paintGL() 将场景渲染到 QGLFramebufferObject 中,然后 - 使用 QGLFramebufferObject 生成的纹理 - 到屏幕上。对于第二步,我使用正交投影渲染全屏四边形,并使用自己的着色器将纹理渲染到它上面。
渲染到 QGLFramebufferObject 似乎工作正常(至少我可以调用 QGLFramebufferObject::toImage().save(filename) 并且我得到正确渲染的图像),但我无法将渲染纹理绘制到屏幕。
这里是我用来渲染到帧缓冲区对象中的代码:
//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());
这是(或)错误的部分。着色器中的采样器统一未设置为纹理对象,而是设置为该对象作为纹理绑定(bind)到的纹理单元(您已经使用 glBindTexture(GL_TEXTURE_2D, _fbo->texture()
)。因此,由于您似乎一直在使用 GL_TEXTURE0
,因此您只需将其设置为纹理单元 0
:
_selectionShader->setUniformValue("renderedTexture", 0);
顺便说一下,不需要 glEnable(GL_TEXTURE_2D)
,使用着色器时不需要。如果您只是将顶点位置用作纹理坐标,为什么还要使用 glTexCoord2f
?
关于c++ - 使用自定义着色器在全屏四边形上从 QGLFramebufferObject 绘制纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19953055/
使用 QT 4.7 和 QGLWidget,我想使用 QGLWidget::paintGL() 将场景渲染到 QGLFramebufferObject 中,然后 - 使用 QGLFramebuffer
我正在尝试学习如何将 QPainter 与 QGLFramebufferObject 一起使用。当我尝试在 QGLWidget 中显示纹理时,它是不可见的。 (完整代码如下) 最终目标是使用 QPai
我为我的应用程序编写了一个基于 OpenGL 的矢量图形渲染器。它需要渲染到帧缓冲对象而不是直接渲染到屏幕。由于我在 Qt 中编写应用程序,因此我使用了 QGLFramebufferObject,它是
出于性能原因,我将 2D 和 3D 渲染分开。每种类型我都有两个 QGLFramebufferObjects,因为 QGLFramebuffer 不支持以 GL_TEXTURE_2D 作为目标的多重采
当我将操作系统从 win7 更改为 Ubuntu 12.04 LTS 时,我遇到了 QGLFrameBufferObject 的一些问题。在新的ubuntu系统重新编译代码后,颜色就出错了。所以我做了
在向 Qt 中的 QGLFrameBufferObjects 渲染具有部分不透明度的简单形状时,我遇到了问题。 我把问题简化为: 当我将一个简单的四边形渲染到颜色设置为 (1,0,0,.5) 的 QG
我的问题的小版本 在 QGraphicsItem::paint() 函数中,我有一个 QGLFrameBufferObject。如何在作为参数传递的画家的paintdevice上获取它? (假设 QG
我是一名优秀的程序员,十分优秀!