【问题标题】:Should I use the last GLSL version where it is possible?我应该尽可能使用最新的 GLSL 版本吗?
【发布时间】:2021-01-03 01:06:41
【问题描述】:

我的跨平台图形程序使用以 GLSL 1.40 版编写的着色器。 GLSL 1.40 的特性完全满足了应用程序的需求。事实上,非常基本的着色器用于渲染纹理:

顶点着色器:

attribute vec2 position;
attribute vec2 textureCoordinates;

uniform mat3 transformationProjectionMatrix;

varying vec2 interpolatedTextureCoordinates;

void main() {
    interpolatedTextureCoordinates = textureCoordinates;
    gl_Position.xywz = vec4(transformationProjectionMatrix * vec3(position, 1.0), 0.0);
}

片段着色器:

precision mediump float;

uniform vec4 color;
uniform sampler2D textureData;

varying vec2 interpolatedTextureCoordinates;

void main() {
    gl_FragColor.rgba = color * texture(textureData, interpolatedTextureCoordinates).bgra;
}

在程序中为不同版本的 GLSL 设置多个着色器是否有意义,这些着色器将根据特定硬件的支持进行选择? 使用更现代的着色器语言版本是否可以获得加速?

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    使用更现代的着色器语言版本是否可以获得加速?

    不,只要您的代码不使用较新 GLSL 版本中可用的某些功能进行优化,性能应该几乎相同。

    在程序中为不同版本的 GLSL 设置多个着色器是否有意义,这些着色器将根据特定硬件的支持进行选择?

    通常情况下,为不同的 GLSL 版本复制着色器程序应该没有任何好处。 OpenGL 允许为不同的程序混合 GLSL 版本(但您不应该为同一程序的不同着色器混合版本),因此使用图形引擎支持的 最低 GLSL 版本是有意义的,并声明更高版本仅适用于需要它的特定可选 GLSL 程序。

    实际上不需要为不同的 GLSL 版本复制着色器,因为可以使用不同的 GLSL 版本头编译相同的源代码,并使用一些额外的技巧/辅助宏,因为 GLSL 保持向后兼容性(唯一的主要断点是 GLSL 150 / OpenGL 3.2 删除一堆功能并更改 GLSL 语法)。

    然而,OpenGL 驱动程序中的错误可能会改变视图。例如,我在支持 OpenGL ES 3.0 的设备上遇到了一些编译为#version 300 es 的 GLSL 程序的严重不当行为(但不是更高 - 例如,这些是引入 OpenGL ES 3 支持的第一个驱动程序,并且这种支持非常错误),而编译为#version 100 es 的同一程序按预期工作。

    当您使用一些较新的 GLSL 版本功能而不观察它时,可能会出现另一个问题。 GLSL 规范是一件很重要的事情,作为一个书呆子,您可能会花费大量时间来确切地知道哪个版本添加了这个或另一个特定功能 - 有些可能会让您感到惊讶。请注意,许多驱动程序实际上可以容忍某些新功能的使用,而无需指定适当的 GLSL 版本(只要硬件确实支持它)。这样您就可以确信您的 GLSL 程序符合 #version 140 标准,而实际上并非如此 - 这可以通过在另一个 OpenGL 驱动程序上进行测试来突然发现。

    根据我的经验,NVIDIA 驱动程序允许大多数严重偏差与 GLSL 规范(可能是因为他们的 GLSL 编译器将代码翻译成另一种语言 - Cg)。 AMD 驱动程序更严格,但仍然允许一些偏差。到目前为止,我在 macOS OpenGL 驱动程序中看到的容忍度较低/最严格的 GLSL 验证器。在这种情况下,指定更高的 GLSL 版本可能会更安全/更健壮,以便与更广泛的硬件兼容,尽管这只会隐藏“受支持”最低 GLSL 版本定义中的错误。

    【讨论】:

    • 也许 OP 可能想使用 Khronos 的 glslang 工具来验证着色器平台无关性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2011-07-03
    • 1970-01-01
    • 2020-10-05
    相关资源
    最近更新 更多