java - 用于在着色器 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;
}
但随后将需要创建几个具有不同颜色的不同着色器。
就性能而言,哪个选项更好用或差别不大?将不胜感激任何回答/评论。
解决方案
在文献中发现。着色器中对于所有顶点或片段保持不变的任何参数都必须作为统一变量传递。出于性能原因,其值在编译时已知的变量应该是常量,而不是统一变量。
推荐阅读
- google-cloud-platform - 无法将数据集上传到 AutoML 自然语言文本分类 GUI
- javascript - 当我使用 cypress 时,如何阻止网站自动将我注销?
- javascript - 如何使用 expressjs 将我的数据保存在 mongoDB 上?
- java - 我应该在一个类中实现所有接口还是为每个类创建一个类?
- c# - 如何从控制器内重定向到 HTML 页面?
- python - 根据其他列值计算熊猫列值的百分比变化(随时间变化)
- spring-boot - 找不到类型为“org.springframework.web.reactive.function.client.WebClient”的 Bean
- c++ - 将参数包与 std::function 一起使用时出错
- c# - 从字典列表返回匿名列表
其中键等于一个值 - azure-devops - 积压的层次结构仅暂时显示,然后列表是平面的