用于在着色器OpenGL ES 2.0 / 3.0中存储常数值的统一值

问题描述 投票:0回答:1

Android应用程序使用统一将颜色矢量传输到着色器。转移到着色器一次:

private final int colorLink;
private final float[] color;

public Object3D(float[] color) {
    this.color = color;
    colorLink = GLES20.glGetUniformLocation(program, "u_color");
}

public void onDrawFrame(GL10 glUnused) { 
    if(objectJustCreated) { // check will be performed anyway
        objectJustCreated = false;
        GLES20.glUniform4f(colorLink, color[0], color[1], 
            color[2], color[3]); 
        ...
    }
}

片段着色器:

#version 300 es
uniform vec4 u_color;
out vec4 fragColor;
...
void main()
{
    ...
    fragColor = u_color * texColor;
}

另一个选择是使用常量:

out vec4 fragColor;
const vec4 c_color = vec4(1.0, 0.7, 0.1, 1.0);
...
void main()
{
    ...
    fragColor = c_color * texColor;
}

但是随后将需要创建几个具有不同颜色的不同着色器。

哪种选择在性能上更好,还是没有太大区别?对于任何答案/评论将不胜感激。

java opengl-es shader
1个回答
0
投票

在文献中发现。着色器中对于所有顶点或片段保持不变的任何参数都必须作为统一变量传递。出于性能原因,在编译时其值已知的变量应该是常量,而不是均匀变量。

© www.soinside.com 2019 - 2024. All rights reserved.