OpenGL3 +是否允许特定状态来渲染仅2D图形?

时间:2014-02-18 15:23:20

标签: opengl

我目前正在研究2D图形,据我所知,每个顶点最终都被处理为均匀空间中的4D点。所以我对自己说:多么浪费资源!我认为硬件基本上是为处理3D场景而设计的,因此可以硬编码来进行4d线性代数。然而,有没有办法编写着色器(或启用一堆选项),以便在硬内存中只使用真正的2d坐标?我知道可以在4x4矩阵中嵌入两个2x2矩阵,但gl_Position变量为vec4似乎在此处结束。我不是在寻找像这样的某种“解决方法”黑客,而是寻找一种让OpenGL做到这一点的规范方法,比如特定的模式/状态。

我无法在网上找到示例代码甚至是简单的提及这样的事实,所以我认为它应该只是不可能/不可取的,比如性能原因。是这样吗?

2 个答案:

答案 0 :(得分:1)

现代GPU实际上是标量架构。在GLSL中,您还可以编写更短的向量。 vec2是一个完全有效的类型,您可以创建每个向量只有2个标量元素的顶点数组,由glVertexAttribPointer

size参数定义

正如Anon M. Coleman评论的那样,OpenGL将在内部为传入的任何数据执行vec4(v, [0, [0]], 1)构造,作为维度的顶点属性< 4。

在顶点着色器中,您必须将vec4指定给gl_Position。但您可以轻而易举地将vec2扩展为vec4

vec2 v2;
gl_Position = vec4(v2, 0, 1);

是的,gl_Position输出始终必须是vec4,因为OpenGL指定了剪辑空间中的操作。但这根本不是瓶颈。

答案 1 :(得分:0)

所有的功劳归功于Andon M. Coleman,他完美地回答了这个问题作为评论。我只是为了完成而在这里引用它:

«绝对不是。多年来,硬件本身是围绕4组件数据和指令设计的。现代GPU是标量友好的,他们必须考虑推动GPGPU(但GeForce 8xxx之前的旧NV GPU具有纯矢量ALU)。现在,对于顶点属性,您将获得16个大小的槽(float * 4)进行存储。这意味着您是使用vec2还是vec4顶点属性,它实际上表现得像vec4。如果您编写vec4并且仅为其中两个组件提供足够的数据,则可以看到这一点 - GL自动分配Z = 0.0W = 1.0

此外,您无法在2D空间中使用2D坐标实现裁剪。您需要齐次坐标来生成NDC坐标。您需要使用窗口空间坐标,这是顶点着色器无法做到的。顶点着色器完成后,GL将执行裁剪,透视分割和视口映射以到达窗口空间。但是窗口空间坐标仍然是4D(Z分量可能不会影响窗口空间中的位置,但它确实会影响片段测试)。 »