首页 > 解决方案 > 用于在着色器 OpenGL ES 2.0/3.0 中存储常量值的统一值

问题描述

Android 应用程序使用 uniform 将颜色矢量传输到着色器。传输到着色器只完成一次:

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;
}

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

就性能而言,哪个选项更好用或差别不大?将不胜感激任何回答/评论。

标签: javaopengl-esshader

解决方案


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


推荐阅读