如何在OpenGl中使用橡皮筋

时间:2011-07-27 17:20:16

标签: c++ opengl rubber-band

我正试图在OpenGL和Visual Studio C ++中寻找橡皮筋的方法。我遇到的问题是一些Win 7计算机(即我的老板')不允许我读取或绘制到前缓冲区,从而直接杀死它。

glDrawBuffer( GL_FRONT );
glEnable(GL_COLOR_LOGIC_OP);
glLogicOp( GL_XOR );
glPolygonMode(GL_FRONT, GL_LINE);
glRecti(X0, Y0, X1, Y1);
X1 = X;
Y1 = Y;
glRecti(X0, Y0, X1, Y1);
*//Doesn't draw lines*

或将前缓冲区复制到后台缓冲区(重绘到它需要很长时间)调用swapbuffers绘图然后交换agian

glReadBuffer( GL_FRONT );
glDrawBuffer( GL_BACK );
glCopyPixels(0, 0, Width, Height, GL_COLOR);

glEnable(GL_COLOR_LOGIC_OP);
glLogicOp( GL_XOR );
glPolygonMode(GL_BACK, GL_LINE);
SwapBuffers(hdc);
glRecti(X0, Y0, X1, Y1);
X1 = X;
Y1 = Y;
glRecti(X0, Y0, X1, Y1);
SwapBuffers(hdc);   
*//Doesn't display original drawing*

任何想法?

1 个答案:

答案 0 :(得分:1)

我会这样做:

  • 将场景绘制到屏幕外缓冲区(后台缓冲区或其他)
  • 使用glReadPixels将图像读取到主存储器
  • 从主存储器中的图像中制作纹理

在此之后,要在屏幕上绘制图像,您只需绘制一个覆盖整个渲染区域的四边形,并使用创建的纹理进行纹理处理。这样,在将图像绘制到屏幕时,无需重新渲染实际场景。

现代OpenGL实现也可以渲染到纹理,无需将图像移动到主存储器并返回。然后,如果渲染场景已经很慢,那么这里的性能差异将不会很明显。