2012-07-08 32 views
6

我正在为iPhone开发一个OpenGL应用程序。在我的顶点着色器中,我需要一种方法来同时更改大量(但不是全部)顶点的颜色,所以我决定采用颜色索引。这将允许我离开VBO静态,并修改一个统一的变量,而不是循环遍历每个顶点并修改每个帧之间的颜色信息。在OpenGL ES 2.0中为数组索引提供一个整数?

我的计划是用颜色数组创建一个统一的,在属性中添加一个包含索引的整数。这里是我的顶点着色器:

uniform mat4 u_mvp_matrix; 
uniform vec4 u_color_array[]; 

attribute vec4 a_position; 
attribute int a_colorIndex; 

varying lowp vec4 v_color; 

void main() 
{ 
    v_color = u_color_array[a_colorIndex]; 

    gl_Position = u_mvp_matrix * a_position; 
} 

这就提出了一个错误:

int can't be an in in the vertex shader

我做了一些研究。 iPhone最新支持OpenGL ES 2.0,这意味着它最迟支持GLSL 1.2,并且显然只有GLSL 1.3和更高版本才支持整数。我试着将a_colorIndex更改为float。我没有想到它会起作用,但事实并非如此。

如何为每个顶点指定颜色索引?

+0

也许考虑一个纹理查找,其中你的索引是一个uv浮点数,而不是数组查找?或者你可以将float转换为int吗? – Tim 2012-07-08 01:16:18

+1

“这意味着它最迟支持GLSL 1.2”不,它不。 GL ES 2.0意味着它支持GLSL *** ES ***着色语言,与桌面GLSL语言* *不同。 GLSL ES基于GLSL 1.2,但他们*不是同一件事。* – 2012-07-08 02:46:50

回答

4

将属性指定为浮点数。你可以使用浮点数作为数组的索引。

+0

我得到这个错误“索引表达式有类型'浮动',但应该有整型”如果我按你说的做。数组[int(fIndex)]安全吗?还是会遇到精度错误? – weezor 2013-03-27 17:57:26

+0

我遇到了与weezor相同的问题(“...应该有整型”)(至少在某些情况下)。这很好,澄清。 – 2014-03-12 04:50:12

+0

ES2语言规范说:“使用类型为整数的表达式访问数组元素。”所以是的,投到int(宽松的平台做一个隐式投射,所以回答可能适用于回答者的机器)。 – kiwibonga 2014-05-12 08:42:20