OpenGL ES 2.0 : 2D 프로젝션 설정


15

이 기사는 일반적으로 고정 함수 파이프 라인을 사용하여 선명한 OpenGL 2D 그래픽을 그리는 방법을 설명합니다.

OpenGL ES 2.0에는 사용할 수없는 ES 1.x 함수 (예 : glOrtho ())가 있으므로 Fragment / Vertex 쉐이더에서 해당 기능을 대체해야합니다.

내 질문은 프로그래밍 가능한 함수 파이프 라인에서 다음 2D 투영을 설정하는 방법입니다.

const XSize = 640, YSize = 480
glMatrixMode (GL_PROJECTION)
glLoadIdentity ();
glOrtho (0, XSize, YSize, 0, 0, 1)
glMatrixMode (GL_MODELVIEW)

위에서 언급 한 고정 함수 2D 프로젝션 설정을 완전히 대체하도록 Fragment 및 Vertex 쉐이더를 어떻게 구성해야합니까?

답변:


12

내 OpenGL ES 2.X 엔진에서 CPU 측에서 MVP 매트릭스 (Model View Projection)를 계산하고 정점 셰이더에 주입합니다.

직교 투영법은 4 * 4 행렬 입니다. MVP가 있으면 정점 셰이더에 다음과 같이 주입합니다.

 mMvpLoc = getUniformLocation("uMvp");
 glUniformMatrix4fv(mMvpLoc, 1, false, mMvp.pointer());

mMvp는 CPU 측의 매트릭스 4 * 4입니다. getUniformLocation은 프로그램 셰이더를로드 한 후에 한 번만 수행 할 수 있습니다.

버텍스 쉐이더의 예 :

uniform mat4    uMvp;
attribute vec3 aPosition;
varying vec4 vColor;

void main() {
   vec4 position = vec4(aPosition.xyz, 1.);
   gl_Position = uMvp * position;
}

gl_Position은 미리 정의 된 특수 변수입니다. 꼭짓점의 위치를 ​​포함해야합니다.

프래그먼트 셰이더의 예입니다. 각 점을 그릴 때마다 최종 색상 "gl_FragColor"를 계산해야합니다.

#ifdef GL_ES
precision highp float;
#endif

void main(void)
{
   gl_FragColor = vColor;
}

이 프로그램은 각 꼭짓점에 대해 정의 된 부드러운 색상으로 삼각형을 그립니다.

더 나은 자습서를 보려면 이 훌륭한 문서를보십시오.


엘리스 안녕하세요, 이것은 훌륭하고 완전한 답변입니다. 대단히 감사합니다. 문안 인사.
Bunkai.Satori

9

glOrtho 문서에서 값이 대체되었습니다.

         2
    ------------       0              0             -1
       XSize
                       2
        0         ------------        0              1
                   - Ysize
        0              0              -2            -1
        0              0              0              1

이 행렬을 균일하게 저장 한 다음 들어오는 정점 위치에 적용 할 수 있습니다 (예 : M.v 곱 수행).


Bahbar님께, 답변 감사합니다. 따라서 기본적으로 ES2.0에는 glOrtho () 매트릭스 대체를 수동으로 만드는 것 외에 다른 점이 없습니다.
Bunkai.Satori

@ Bunkai.Satori : 글쎄, GL은 일반적으로 모델 뷰와 프로젝션의 합성물을 유니폼에 업로드한다는 점에서 조금 더 있습니다.
Bahbar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.