2014-04-10 1 views
0

OpenGLES 2로 앱을 만들려고합니다. 테스트 용 장치가 2 개 있습니다. 불행히도 둘 사이에 차이가있는 것으로 보입니다.OpenGL ES - 벡터 유니폼을 찾을 수 없습니다 - 행렬 만 작동합니다

// vertex shader 

uniform mat4 uVMatrix;   // View Matrix 
uniform mat4 uPMatrix;   // perspective Matrix 
uniform vec3 uLight1Pos;  // LightPos 

attribute vec4 aPosition; 
attribute vec4 aColor; 

varying vec4 vColor; 

void main() { 
    vColor = aColor; 
    mat4 MVPMatrix = uPMatrix * uVMatrix; 
    gl_Position = MVPMatrix * aPosition; 
} 

// fragment shader 

uniform mat4 uVMatrix; 
uniform vec3 uLight1Pos; 

varying vec4 vColor; 
varying vec3 vPosition; 

void main() { 
    vec3 light2Pos = uLight1Pos;  
    gl_FragColor = vColor; 
} 

문제는, 어떤 유니폼을 찾을 수 없습니다

내가 테스트를 위해 다음과 같은 "기본"쉐이더 코드가 있습니다.

나는 연결하고 평소와 같이 쉐이더를 연결하지만, 같은 ID를 확인 :

uVMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uVMatrix"); 
uPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uPMatrix"); 
uLight1PosHandle = GLES20.glGetUniformLocation(mProgram, "uLight1Pos"); 

나는 다른 값을 얻는다. 내 갤럭시 S1에서는 2, 1, 3입니다 (따라서 모든 유효한 값 - 이상한 주문 임에도 불구하고). 내 Galaxy S3에서는 0, 1, -1입니다 (마지막 하나를 찾을 수 없습니다).

내가 뭘 잘못하고 있니? S3 (말리 GPU)에서 제복을 다르게 선언해야합니까? 참조를 얻으려면 유니폼을 "사용해야"한다는 것을 깨달았습니다. 그것이 내가 쓴 이유입니다. vec3 light2Pos = uLight1Pos;이 작업을 수행하지 않으면 S1에 대한 참조도 얻지 못합니다.

도움 주셔서 감사합니다.

토비아스

- 편집이 - 충분한

이상한, 나는 mat4VEC3에서 버텍스 쉐이더의 유니폼을 변경하려고 :

uniform mat4 uLight1Pos; 
mat4 lPos = uLight1Pos; 

그것은 나타납니다 그 매트릭스 잘 작동 그리고 엄마를 사용할 때 그것에 대한 핸들을 얻을 수 있습니다 trix. 어째서?

답변

2

귀하의 "사용"은 출력물에 영향을 미치지 않습니다. S3가 죽은 코드를 제거하기 위해 S1보다 더 나은 컴파일러를 가지고 있음을 증명했습니다.

+0

아, 알겠습니다. 그래서 비록 내가 그들을 "사용"한다고해도 그들은 실제로 사용되거나 제거되지 않았습니다. 고마워. 마치 내 잘못이었던 것처럼 보입니다! :디 –

1

GLSL 컴파일러는 결과에 기여하지 않는 사용되지 않은 유니폼을 제거하는 경향이 있습니다. 이 동작은 OpenGL 사양을 준수합니다.

경우에 컴파일러는 vec3 light2Pos = uLight1Pos;을 제거하여 uLight1Pos 유니폼을 쓸모 없게 만들 수 있습니다.

관련 문제