OpenGL像素缓冲区直接在Linux和Mac OSX中进行屏幕显示

时间:2012-07-16 02:53:13

标签: linux macos opengl screen buffer

我正在寻找一种将像素缓冲区直接渲染到屏幕的方法。我需要一种方法在OSX和Linux上完成它,虽然我知道我可能需要通过不同的方法为每个操作系统做这件事(虽然跨平台库会很好。)你从哪里开始?

1 个答案:

答案 0 :(得分:5)

您可以随时使用四边形的正投影投影到背面缓冲/表面。

或者只需在NDC空间中发送四边形(-1到+1),而无需任何矩阵乘法。

更新,因为这显然不够明确:

对于“全屏四边形”方法,发送两个tris或一个四边形,如下所示:

enter image description here

顶点的配置/顺序取决于您的缠绕顺序和原始模式。 Z值应介于-11之间。您只需选择-1即可。投影和ModelView矩阵应该是一个单位矩阵(全是零,然后是主对角线上的1)

enter image description here

换句话说,您不需要进行任何矩阵乘法,因此您的着色器中实际上不需要任何矩阵运算,因为坐标已经处于规范化设备坐标(NDC)中。

即。它在enter image description here

的目标设备间隔内被读取

以下是一些代码:

glMatrixMode (GL_MODELVIEW); 
glPushMatrix (); 
    glLoadIdentity (); 
    glMatrixMode (GL_PROJECTION); 
    glPushMatrix (); 
        glLoadIdentity ();
        glBegin (GL_QUADS); 
        glVertex3i (-1, -1, -1); 
        glVertex3i (1, -1, -1); 
        glVertex3i (1, 1, -1); 
        glVertex3i (-1, 1, -1); 
        glEnd ();
    glPopMatrix (); 
    glMatrixMode (GL_MODELVIEW); 
glPopMatrix ();

然后,顶点着色器只是像素/片段着色器的直接传递。显然,您将相关的像素/纹理缓冲区设置为着色器资源/变量,并在像素/片段着色器中对其进行采样。并且不要忘记将顶点的texcoord UV设置为相应的纹理值(0-1)。

或者您也可以使用相应的窗口系统将纹理直接blit到窗口表面。这在很大程度上取决于您用于窗口管理的内容(例如SDL),也可能需要某种纹理格式/布局才能工作(或转换)。