【问题标题】:OpenGL pixel buffer directly to screen in Linux and Mac OSXOpenGL 像素缓冲区在 Linux 和 Mac OSX 中直接到屏幕
【发布时间】:2012-07-16 02:53:12
【问题描述】:

我正在寻找一种将像素缓冲区直接渲染到屏幕的方法。我需要一种在 OSX 和 Linux 上执行此操作的方法,尽管我知道我可能需要针对每个操作系统通过不同的方法来执行此操作(尽管跨平台库会很好。)您从哪里开始?

【问题讨论】:

    标签: linux macos opengl screen buffer


    【解决方案1】:

    您始终可以使用四边形的正交投影到您的后缓冲区/表面。

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

    更新,因为这显然不够清楚:

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

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

    换句话说,您不需要做任何矩阵乘法,因此您实际上不需要在着色器中进行任何矩阵操作,因为坐标已经在标准化设备坐标 (NDC) 中。

    即已经在的目标设备区间内

    这里有一些代码:

    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)。

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

    【讨论】:

    • 你是怎么做到的?你有如何完成的链接吗?还是一些代码?
    • @BЈовић 我不应该投反对票。我写的内容对所有图形 API 都是普遍适用的。我写的内容提供了足够的信息来“开始”——互联网上有无数的例子; OP询问从哪里开始。我相信给出理论而不是为他们编写代码,但我会通过给出一些例子来满足你。
    • 这正是我所需要的,非常感谢。这是一个非常好的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多