2013-06-11 6 views
1

균일 한 배열을 통해 쉐이더에 밝은 색 및 밝은 색 정보를 전달하려고합니다.GLSL 균일 배열이 잘못된 값

 uniform vec2 lightpositions[4]; 
    uniform vec4 lightcolors[4]; 

그리고 내 코드 (C++)에서 :

float lightpositions[8] = { 
     150, 150, 
     (float) screenWidth - 150, 150, 
     (float) screenWidth - 150, (float) screenHeight - 150, 
     150, (float) screenHeight - 150 
}; 

float lightcolors[16] = { 
     1.0, 0.0, 0.0, 1.0, 
     1.0, 1.0, 0.0, 1.0, 
     1.0, 0.0, 1.0, 1.0, 
     0.0, 1.0, 1.0, 1.0 
}; 

glUniform2fv(lightposHandle, amount, lightpositions); 
checkGlError("lightPositions"); 

glUniform4fv(lightcolorHandle, amount, lightcolors); 
checkGlError("lightColors"); 

어디 양이 경우 4 이 같은 내 쉐이더에서 이러한 선언했다.

내가 OpenGL ES 디버거 (PerfHud ES)를 검사 할 때 배열의 값이 1.4e + 02와 거의 비슷하다는 것을 알 수 있습니다.

내가 잘못 했나요? 이 경우 속성을 사용해야합니까?

+1

나머지 코드는 무엇입니까? 'glUniform ... '을 호출 할 때 프로그램이 사용 중입니까? 유니폼 위치는 적당한 값을 가지고 있는가? (주의 :'-1'의 균일 한 위치는'glUniform'가 에러를 발생시키지 않도록 *이 경우에는 단지 no-op입니다.)? –

+1

"* 배열의 값이 1.4e + 02 *와 같이 거의 무작위임을 알 수 있습니다."이것은 무작위가 아닙니다. 1.4e + 02는 단지 140에 대한 과학적 표기법입니다. –

+0

@ NicolBolas이 숫자가 나에게 아무런 의미도없고 패턴을 포함하지 않는다는 의미에서 무작위를 의미했습니다. 여기에 내 그림 코드가 있습니다 : [link] (http://pastebin.com/5c5Rzbwk) –

답변

0

알려줘야 나는 그것을 해결했다.

클래스에서 배열을 생성 한 다음 생성자를 통해 Lights 클래스로 전달했습니다. 내 light 클래스는이 배열을 private float * lightpositions에 할당합니다. 이것은 틀린 값의 원천이었습니다. 왜냐하면 나는 (누군가가 이것을 분명히 할 수 있다면) 배열의 주소를 전달하고 있다고 생각하기 때문입니다. 일반 배열 (float test [8])을 만들면 셰이더에 전달 된 값이 정확합니다.

-1

OpenGL ES 2.0 쉐이더 코드에서는 이와 같이 배열 표기법을 사용할 수 없습니다. 그것은 3.0 기능입니다.

다른 OpenGL ES 드라이버가있는 다른 플랫폼에서 시도해 보겠습니다. 당신은 또한 다음과 같이 정밀 지정자를해야 할 수도 있습니다

uniform highp vec2 lightpositions[4]; 
uniform highp vec4 lightcolors[4]; 

하기는 OpenGL ES 3.0,이 같은 VEC3의 배열로 배열을 구성해야합니다 :

vec3 lightcolors[6] = 
{ 
    vec3(1.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f), vec3(0.0f, 0.0f, 1.0f), 
    vec3(1.0f, 1.0f, 0.0f), vec3(1.0f, 0.0f, 1.0f), vec3(0.0f, 1.0f, 1.0f) 
}; 
+1

OpenGL ES 2.0에서 가능하다고 docs가 밝혔습니다. 프로그램 세션에서이 [link] (http://www.khronos.org/opengles/sdk/docs/reference_cards/OpenGL-ES-2_0-Reference-card.pdf)를 확인하십시오. –

+0

내가 가지고있는 모든 OpenGL ES 쉐이더 코드를 검색했는데 배열 표기법을 사용하여 찾은 유일한 예는 3.0이었다. 2.0 드라이버 또는 Android 장치가 작동하는 곳을 찾으면 알려주십시오. – ClayMontgomery

+0

당신의 대답은 어쨌든 그의 * C++ * 예제의 그의 배열 초기화가 그의 * GLSL * 코드 (특히 마지막 단락)에서 나온 것이라고 생각하는 것 같습니다. 사실 그렇지 않습니다. 그가하는 것처럼 GLSL의 유니폼 배열을 선언하는 것은 ES 2.0에서 완벽하게 잘해야합니다 (사양은 http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf). –

1

셰이더는 모습입니다 올바른 (매우 유사한 선언에 대해서는 "ESSL specification"의 4.1.9 절 참조) API 코드도 마찬가지입니다.

내 생각에 일관된 위치를 쿼리 할 때 문제가 발생하고 하나 이상의 위치가 -1로 반환됩니다. -1이 리턴되면 glGetUniformLocation을 호출 할 때마다 점검하십시오.

(당신이 당신의 질문에 쉐이더 코드를 일치하지 않는 게시 된 도면 코드 glGetUniformLocation에 대한 호출에 사용 된 이름. 이것은 당신이 찾고있는 버그가 될 수는.)

+0

네가 맞습니다. lightposHandle = glGetUniformLocation (programHandle, "lightpositions"); 0을 반환하고 lightcolorHandle = glGetUniformLocation (programHandle, "lightcolors"); -1을 반환합니다. 이름이 100 %와 일치하고 프로그램이 정확하기 때문에 이상합니다. –

+0

[link] (http://pastebin.com/g49HCaG3)와 같이 전화 추적을 업로드했습니다. 첫 번째 드로 콜 (25 번째 줄)이 문제가되는 코드가 될 때까지는 모든 것이 있으며, 그 외에도 두 가지 다른 오브젝트가 있습니다. –

+0

전화 추적은 문자열 매개 변수를 마술 16 진수 값으로 대체하는 데별로 도움이되지 않습니다. 모든 쉐이더와 유니폼 위치를 쿼리하는 코드를 게시 할 수 있습니까? –