OpenGL ES 2:简单绘图是否需要顶点和片段着色器?

5

我目前正在使用在运行时生成的几何形状进行绘图例程,只是单色。在寻找最小GL设置以进行绘图时(我匹配屏幕分辨率,并且我是在iOS上,但问题同样适用于其他ES 2平台),我发现大多数示例都使用顶点和片段着色器,但不是所有示例。

如果我不打算使用任何纹理或光照(只是直接颜色复制/混合),并且我不打算进行任何无法通过操纵视图矩阵完成的变换,那么我真的需要设置顶点和/或片段着色器吗?如果没有,那么与无着色器方法相比,使用着色器是否有任何优势?

1个回答

7
据我所知,是的,它们是必需的。OpenGL ES 2.0与OpenGL ES 1.x不兼容,两者之间的主要区别在于自定义着色器。
使用着色器(2.0)或不使用(1.x)的优劣取决于您应用程序当前和长期功能的需求,但是1.x的固定管道正在迅速成为过去时。最近发布的OpenGL ES 3.0规范兼容2.0,但不兼容1.x。
OpenGL ES 2.0使用可编程管道,因此您必须始终声明顶点和片段着色器。您可以为几何形状+颜色声明的最简单的着色器如下:
// Vertex Shader

attribute vec3 position;

void main(void)
{
     gl_Position = vec4(position, 1.0);
}

并且:

// Fragment Shader

uniform lowp vec3 color;

void main(void)
{
     gl_FragColor = vec4(color, 1.0);
}

来源: Khronos网站和文档

"OpenGL ES 2.0规范的重大变化是不再支持OpenGL固定功能的变换和片段渲染管线。"


2
唯一值得补充的评论是,GLKit可以为您提供ES 1.x等效的着色器;例如,请参见GLKBaseEffect。因此,ES 2需要它们被提供,但在iOS下不需要自己编写。 - Tommy
真的,Tommy 的建议很好。然而,我真的不建议使用 GLKBaseEffect,因为你没有与 OpenGL ES 统一发展(如 3.0 的方向所示),可能会陷入无关的编码实践中。GLKit 在设置视图时避免了繁琐的样板代码,非常棒。 - Ricardo RendonCepeda
刚刚注意到这个问题被重新标记为“Android”,所以我想GLKit讨论就不重要了。但我希望这对任何iOS观众都是有用的信息! - Ricardo RendonCepeda
@Tommy:我也刚发现这个,确实在iOS上很有用。 - Slipp D. Thompson
1
@Dmitry 在我提出这个问题之后的四年中,针对我的使用情况,我发现在着色器中进行简单的算法图形生成通常比从纹理到屏幕的位块传输快得多。我认为这是因为对于GPU来说,少量的数学运算和目标缓冲器内存写入相对较便宜(特别是由于管道已经针对帧缓冲器写入进行了优化),但如果你从纹理中进行位块传输,则会产生相对较高的纹理读取开销。因此,“数据的接近程度”比操作次数更重要。 - Slipp D. Thompson
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接