【问题标题】:OpenGL ES 2: Are vertex and fragment shaders necessary for simple drawing?OpenGL ES 2:简单绘图是否需要顶点和片段着色器?
【发布时间】:2019-10-17 13:57:22
【问题描述】:

我目前正在使用运行时生成的几何图形进行一些绘图例程,并且仅使用纯色。在寻找最小的 GL 设置来进行绘图时(我正在匹配屏幕分辨率并且我是 iOS,但问题也适用于其他 ES 2 平台),我看到大多数示例使用顶点和片段着色器,但不是全部。

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

【问题讨论】:

    标签: opengl-es opengl-es-2.0 shader


    【解决方案1】:

    据我所知,是的,它们是必要的。 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 Website & Docs

    “OpenGL ES 2.0 规范中的重大变化是 OpenGL 固定函数转换和片段管道不是 支持。”

    【讨论】:

    • 非常有用。谢谢。
    • 唯一值得补充的是 GLKit 可以为您提供 ES 1.x 等效的着色器;参见例如GLKBaseEffect。所以 ES 2 要求提供它们,但在 iOS 下不需要自己编写。
    • 真的,很好的补充@Tommy。但是,我真的建议不要使用 GLKBaseEffect,因为您没有与 OpenGL ES 一致地发展(如 3.0 的方向所见),并且可能会陷入不相关的编码实践中。 GLKit 非常适合在设置视图时避免繁琐的样板代码。
    • 刚刚注意到这个问题被重新标记为“Android”,所以我猜 GLKit 讨论无关紧要。但我希望它对任何 iOS 观众都是有用的信息!
    • @Dmitry 对于我的用例 (在我提出这个问题后的 4 年里),我发现在着色器中进行简单的算法图形生成是通常比从纹理到屏幕快得多。我相信这是因为对于 GPU 而言,少量的数学运算和目标缓冲区内存写入相对便宜(特别是因为管道针对帧缓冲区写入进行了优化),但是如果您从纹理中进行 blit,则会导致纹理读取,相比之下,它的价格适中。所以数据的“接近性”比操作数更重要。
    猜你喜欢
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多