2014-11-09 2 views
0

OpenGL ES 2.0을 사용하는 Android 장치 용 앱을 개발 중이며 카메라 이동 방법을 이해하는 데 어려움이 있습니다 (궁극적으로 '화면 흔들림'효과를 생성하려고합니다. 그래서 현재 렌더링 된 모든 객체가 조화롭게 움직여야합니다.)OpenGL ES 2.0의 카메라 위치 변경

그래서 지금은 SpriteBatch 클래스를 사용하여 하나의 OpenGL 호출에서 엔티티의로드를 배치하고 모두 렌더링합니다. 이 클래스 내에서

, 내 정점을조각 쉐이더를 가지고있다.

그래서, 나는 단순히 내 개체에 대해이 클래스의 인스턴스를 생성 ..... 뭔가 같은 :

SpriteBatch tileSet1 = new SpriteBatch(100); //100 tiles 

그때 이런 식으로 렌더링합니다 : 내

tileSet1.render(); 

GLSurfaceView 클래스 (onSurfaceChanged에서),이 같은 내보기를 설정하고있다 :

//offsetX, offsetY, width and height are all valid and previously declared) 

GLES20.glViewport(offsetX, offsetY, width, height); 

Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); 

을 그리고, 승 내 onDrawFrame() 방법을 ithin, 단순히 같은 내 모든 로직 및 렌더링 전화 :

logic(); 
render(); 

(물론, 내 게임 루프는 크게이 질문의 목적을 위해 간소화되었습니다).

나는 어디에 넣어야할지 모르겠다. Matrix.setLookAtM.

내 'GLSufaceView'클래스에 다시 놓으려고했는데 다시 onSurfaceChanged에 있지만 효과가없는 것 같습니다. setLookAtM은 쉐이더와 어떻게 관련이 있습니까? 내 셰이더가 내 'SpriteBatch'클래스에 있고 그 클래스의 인스턴스에 속하기 때문에 묻습니다. (나는 이것을 완전히 오해 할 수 있습니다.)

코드가 더 필요하면 질문하고 게시하겠습니다.

올바른 방향의 포인터가 좋을 것입니다.

답변

3

Matrix.orthoM()Matrix.setLookAtM()과 같은 통화는 OpenGL 상태를 전혀 변경하지 않습니다. 그것들은 단지 행렬을 계산하는 유틸리티 메소드 일뿐입니다. 그들은 전달 된 행렬의 값을 첫 번째 인수로 설정하고 그 밖의 것은 설정하지 않습니다.

이러한 행렬을 OpenGL 렌더링에 적용하는 것은 별도의 작업입니다. 당신이 일반적인 사용 사례이 필요한 주요 단계는 다음과 같습니다

  1. 이 버텍스 쉐이더 입력 mat4의 균일 한 변수를 선언합니다.

    :

    gl_Position = ProjMat * ...; 
    
  2. 을 자바 코드에서 쉐이더를 컴파일하고 연결 후 균일 한 변수의 위치를 ​​얻을 : 버텍스 쉐이더 코드에 정점을 변환하면서

    uniform mat4 ProjMat; 
    
  3. 행렬을 사용하여

    int projMatLoc = GLES20.glGetUniformLocation(progId, "ProjMat"); 
    
  4. 원하는 행렬을 계산하고이를 사용하여 균일 변수의 값을 설정하십시오.

    일정한 값 셰이더 프로그램 영역을 가지고는
    Matrix.orthoM(projMat, ...); 
    ... 
    GLES20.glUseProgram(progId); 
    GLES20.glUniformMatrix4fv(projMatLoc, 1, false, projMat, 0); 
    

참고. 당신이 매트릭스를 사용하는 여러 쉐이더 프로그램을 가지고 있고, 그들 모두를 변경하려는 경우, 당신은 glUseProgram()와가 활성화 한 후, 그 각각에 대한 glUniformMatrix4fv() 전화를해야합니다.

+0

안녕 @RetroKoradi이 주셔서 감사합니다. SpriteBatch 루틴 내에서 말한 모든 것을 실제로 수행하고 있습니다. 그래서, 위의 내 tileSet1 예제와 같이 객체의 각 인스턴스에는 언급 한 모든 코드가 있습니다. 내 혼란은 그 클래스 (spriteBatch)의 특정 인스턴스에 대한 것입니다. 내가 알아야 할 것은 내의 SpriteBatch 클래스의 외부의 쉐이더가없는 경우 모든 *** 객체 (또는 게임 세계가 만약에 당신) 이동 *** 그래서 나는 나의 카메라를 이동 않는 방법이다. – Zippy

+0

모든 'SpriteBatch' 인스턴스에 쉐이더 프로그램이 있습니까? 실제로 다른 쉐이더가 필요합니까? 그렇지 않으면 매우 낭비입니다. 내 질문에서 언급 한 바와 같이 –

+0

예, 나는의 SpriteBatch의 모든 인스턴스에 쉐이더 쌍을 가지고있다. 그것에 대해 생각 후,이 갈 수있는 가장 좋은 방법이었다, 그래서 다른 배치는, 다른 변환이 필요할 수 있습니다 - 지금까지,이 모든 문제의 원인이 아니에요 (I는, 대부분에, 인스턴스의 수천을 생성하고 있지 않다에만 약 40) 만약 :-) SpriteBatch 클래스에 없었기 때문에 어디에 가장 적합할까요? 내가이 프로젝트에 남겨두면 (최소한이 프로젝트에서 그렇듯이),이 질문에서 제기 된 문제를 어떻게 해결할 수 있습니까? :-) 감사합니다 – Zippy