我为我的应用程序编写了一个基于OpenGL的矢量图形渲染器.它需要渲染到帧缓冲对象而不是直接渲染到屏幕.因为我在Qt中编写应用程序,所以我使用了QGLFramebufferObject,它是OpenGL帧缓冲对象的包装类.
我创建了一个最小的例子,它显示了在渲染更复杂的东西时我也得到的错误结果(例如使用片段着色器设置颜色与非一个alpha值).我只是在黑色清除的屏幕上渲染一个红色圆圈和一个半透明的绿色圆圈,然后在FBO上渲染相同:
void MainWidget::initializeGL()
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(0, 0, 0, 0);
}
void MainWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
}
void MainWidget::paintGL()
{
// DRAW ON THE SCREEN
{
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(100);
glEnable(GL_POINT_SMOOTH);
glBegin(GL_POINTS);
glColor4f(1, 0, 0, 1);
glVertex2f(-.2, 0);
glColor4f(0, 1, 0, .5);
glVertex2f( .2, 0);
glEnd();
}
QGLFramebufferObject fbo(width(), height());
fbo.bind();
// DRAW ON THE FBO USING THE SAME CODE AND THE SAME CONTEXT
{
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(100);
glEnable(GL_POINT_SMOOTH);
glBegin(GL_POINTS);
glColor4f(1, 0, 0, 1);
glVertex2f(-.2, 0); …Run Code Online (Sandbox Code Playgroud)