2012-07-08 6 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 인 텍스처 조회를 고려해야할까요? 또는 float를 int로 캐스팅/반올림 할 수 있습니까? – Tim

+1

"입니다. 이는 GLSL 1.2를 지원한다는 것을 의미합니다. GL ES 2.0은 데스크톱 GLSL 언어와 다른 * GLSL *** ES *** 쉐이딩 언어를 지원한다는 것을 의미합니다. GLSL ES는 GLSL 1.2를 기반으로 합니다만, 같은 것이 아닙니다. * –

답변

4

속성을 부동으로 지정하십시오. float를 배열의 인덱스로 사용할 수 있습니다.

+0

인덱스 표현식에 'float'유형이 있지만 필수 유형이 있어야합니다. array [int (fIndex)]를 사용하는 것이 안전합니까? 아니면 정밀 오류가 발생합니까? – weezor

+0

나는 (적어도 어떤 경우에는) weezor ("... 필수 유형을 가져야한다")와 같은 문제에 봉착한다. 명확히하는 것이 좋을 것입니다. –

+0

ES2 언어 사양 : "배열 요소는 형식이 정수인 식을 사용하여 액세스됩니다." 그래서 예, int로 캐스트 (관대 한 플랫폼은 암시 적 캐스트를 수행하므로 답변은 응답자의 컴퓨터에서 작동 할 수 있습니다). – kiwibonga

관련 문제