如何在GLSL ES 2.0中的多种颜色属性之间进行有效插值

时间:2016-07-06 11:28:23

标签: opengl-es glsl glsles

我正在使用OpenGl ES 2.0开展项目。我的网格中的每个顶点都有固定数量的颜色属性(比方说5)。最终的每顶点颜色计算为两个选定颜色属性之间的插值。

在我的实现中,两种颜色的选择基于两个给定的索引。我知道if语句可能会受到很大影响,因此选择将所有属性放入一个数组并使用索引来检索所需颜色。我仍然看到显着的性能下降。

attribute vec4 a_position;
//The GLSL ES 2.0 specification states that attributes cannot be declared as arrays.
attribute vec4 a_color;
attribute vec4 a_color1;
attribute vec4 a_color2;
attribute vec4 a_color3;
attribute vec4 a_color4;

uniform mat4 u_projTrans;
uniform int u_index;
uniform int u_index1;
uniform float u_interp;

varying vec4 v_color;


void main()
{
   vec4 colors[5];
   colors[0] = a_color;
   colors[1] = a_color1;
   colors[2] = a_color2;
   colors[3] = a_color3;
   colors[4] = a_color4;

   v_color = mix(colors[u_index], colors[u_index1], u_interp);

   gl_Position =  u_projTrans * a_position;
}

有更好的更有效的方法来计算最终的颜色插值吗?或者至少是一种更好的选择插值颜色的方法?

1 个答案:

答案 0 :(得分:0)

你在这里使用的指数是制服。这意味着每个渲染命令中的每个顶点都使用相同的索引。如果是这样的话......你为什么还要费心去拿这个东西?

您应该只有2个颜色输入值。然后使用glVertexAttribPointer选择将在两者之间插值的两个数组。

您的“显着性能下降”可能与您获取此类值的方式无关,而且与您发送大量永远不会用于任何内容的每个顶点数据这一事实有关。