gpt4 book ai didi

opengl - 片段着色器 GLSL 中未使用的可变变量 - 它们会伤害性能吗

转载 作者:行者123 更新时间:2023-12-05 04:12:30 24 4
gpt4 key购买 nike

GLSL 中未使用的可变变量发生了什么GPU 具有内部着色器缓冲区,这些缓冲区将填充这些值,但由于片段着色器未使用它,这不会是在顶点着色器(每个顶点)中完成的不必要的计算,然后由于它未在片段着色器中使用而被丢弃。

  1. GLSL 编译器可以优化这些错误做法吗?
  2. 如果不是,如果可以从下面的示例中完全从顶点着色器中移除这些变化,是否会有任何性能改进?

注意:我还没有编写这个着色器 - 我在分析和调试 GL 应用程序时遇到过这个着色器,所以很想知道这些是否会导致任何性能。问题或编译器会对其进行优化 - 如果不在 FS 中使用。

示例:

顶点着色器

attribute vec3 Normal;
attribute vec4 Vertex;
uniform mat3 NormalMatrix;
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 ModelViewMatrix;
precision mediump float;
**varying vec3 N;**
**varying vec3 v;**
varying vec2 texCor;
void main(void)
{
v = vec3(ModelViewMatrix * Vertex);
N = normalize(NormalMatrix * Normal);
gl_Position = ModelViewProjectionMatrix * Vertex;
texCor = MultiTexCoord0.xy;
}

片段着色器

precision mediump float;
uniform sampler2D data;
**varying vec3 N;**
**varying vec3 v;**
varying vec2 texCor;
void main (void)
{
vec2 TexCoord = texCor;
vec4 RGB = texture2D( data, TexCoord );
gl_FragColor = vec4(0.0, 0.0, 0.0 , RGB.r);
}

最佳答案

Can GLSL compilers optimize these kind of wrong practices ?

原则上是的,虽然不能保证它们会这样做,因为它需要仅在链接时可用的状态,而不是在着色器编译时。当管道中的所有着色器同时编译时,在 Vulkan 中会更容易。

If NOT , Would there be any performance improvement if these varying can completely be removed from vertex shader

很可能是的,但是 YMMV。不要告诉 GPU 做一些你实际上不需要它做的事情,这只是常识......

这里关键的主要优化实际上是数据方面。大多数应用程序将交错所有属性的顶点数据,因此如果交错缓冲区中有未使用的数据元素,那么这些数据元素将被拉入 GPU,浪费带宽、缓存空间、消耗功率等。图形驱动程序不太可能可以消除这种低效率,因为应用程序可以随时调用 glMapBuffer

总而言之 - 优化着色器和数据结构以删除不需要的内容。还要以正确的精度上传内容(如果着色器只需要 fp16 等,请不要上传 fp32 数据)。

关于opengl - 片段着色器 GLSL 中未使用的可变变量 - 它们会伤害性能吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40266988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com