2012-07-08 5 views
6

Estoy desarrollando una aplicación OpenGL para el iPhone. En mi sombreador de vértices, necesito una manera de cambiar el color de una gran cantidad (pero no de todos) de mis vértices, a la vez, así que me decidí por la indexación de colores. Esto me permitirá dejar la VBO estática y modificar una única variable uniforme en lugar de recorrer cada vértice y modificar la información de color entre cada cuadro.Proporcione un número entero para un índice de matriz en OpenGL ES 2.0?

Mi plan es crear un uniforme con una matriz de colores, agregue un número entero que contenga un índice en los atributos. Aquí está mi sombreado de vértices:

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

Esto generará un error:

int can't be an in in the vertex shader

hice algunas investigaciones. El iPhone admite OpenGL ES 2.0 a más tardar, lo que significa que es compatible con GLSL 1.2 a más tardar, y aparentemente los enteros solo son compatibles con GLSL 1.3 y posterior. Traté de cambiar a_colorIndex a un flotador. No esperaba que funcionara, y no fue así.

¿Cómo puedo especificar un índice de color para cada vértice?

+0

¿Quizás considere una búsqueda de texturas, donde su índice es un flotante uv, en lugar de una búsqueda de matriz? ¿O puedes lanzar/redondear el flotador a un int? – Tim

+1

"lo que significa que es compatible con GLSL 1.2 a más tardar" No, no es así. GL ES 2.0 significa que es compatible con el lenguaje de sombreado GLSL *** ES ***, que es * diferente * del idioma de escritorio GLSL. GLSL ES se basa en GLSL 1.2, pero * no es lo mismo. * –

Respuesta

4

Especifique el atributo como un flotante. Puede usar flotantes como índices en matrices.

+0

Aparece el siguiente error "La expresión de índice tiene el tipo 'float' pero debe tener el tipo integral" si hago lo que dice. ¿Es seguro hacer array [int (fIndex)] o se ejecutará en errores de precisión? – weezor

+0

Me mete en el mismo problema que weezor ("... debería tener tipo integral") (al menos en algunos casos). Sería bueno aclararlo. –

+0

La especificación de idioma ES2 dice: "Se accede a los elementos de la matriz usando una expresión cuyo tipo es un entero". Así que sí, elenco a int (las plataformas indulgentes hacen un molde implícito, por lo que la respuesta probablemente funcione en la máquina del contestador). – kiwibonga

Cuestiones relacionadas