用于在着色器 OpenGL ES 2.0/3.0 中存储常量值的统一值
Uniform values for storing constant values in a shaders OpenGL ES 2.0/3.0
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;
}
但随后需要创建多个具有不同颜色的不同着色器。
在性能方面使用哪个选项更好或差别不大?将不胜感激 answer/comment.
在文献中找到。着色器中所有顶点或片段保持不变的任何参数都必须作为统一变量传递。出于性能原因,其值在编译时已知的变量应该是常量,而不是统一变量。
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;
}
但随后需要创建多个具有不同颜色的不同着色器。
在性能方面使用哪个选项更好或差别不大?将不胜感激 answer/comment.
在文献中找到。着色器中所有顶点或片段保持不变的任何参数都必须作为统一变量传递。出于性能原因,其值在编译时已知的变量应该是常量,而不是统一变量。