2012-04-24 2 views
8

저는 스프라이트 그래픽이있는 OpenGL 2D 게임을 작업 중입니다. OpenGL ES 호출은 OpenGL의 하위 집합이므로 모바일 플랫폼에보다 쉽게 ​​이식 할 수 있다고 권고했습니다. 코드의 대부분은 그냥 그렇게 정의 된 draw_image 함수 호출 :OpenGL ES 용 2D OpenGL 앱을 다시 작성하는 방법은 무엇입니까?

void draw_img(float x, float y, float w, float h, GLuint tex,float r=1,float g=1, float b=1) { 
    glColor3f(r,g,b); 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glBegin(GL_QUADS); 
     glTexCoord2f(0.0f, 0.0f); 
     glVertex2f(x, y); 
     glTexCoord2f(1.0f, 0.0f); 
     glVertex2f(w+x, y); 
     glTexCoord2f(1.0f, 1.0f); 
     glVertex2f(w+x, h+y); 
     glTexCoord2f(0.0f, 1.0f); 
     glVertex2f(x, h+y); 
    glEnd(); 
} 

내가이는 OpenGL은 ES 호환되도록 변경해야합니까? 또한 쉐이더가 아닌 고정 된 함수를 사용하는 이유는 GLSL을 지원하지 않는 컴퓨터에서 개발하고 있기 때문입니다.

+0

GL ES의 버전은 무엇입니까? –

+0

1.1 고정 파이프 라인을 사용하고 있기 때문에 가정합니다. – Skyler

답변

13

OpenGL ES 1.1에서는 쿼드를 그리는 데 glVertexPointer(), glColorPointer(), glTexCoordPointer()glDrawArrays() 함수를 사용합니다. OpenGL 구현과 달리 내장형 glTexCoord2f, glVertex2fglColor3f 메소드를 사용하는 대신 쿼드가 구성하는 구조 (벡터, 색상, 텍스처 좌표)를 설명해야합니다.

원하는 코드를 작성해야합니다. (함수 정의에서 사용한 인수 이름을 사용 했으므로 예제에서 코드를 이식하는 것이 간단해야합니다.)

먼저 쿼드의 한 정점에 대한 구조를 정의해야합니다. 쿼드 정점 위치, 색상 및 텍스처 좌표가 유지됩니다.

// Define a simple 2D vector 
typedef struct Vec2 { 
    float x,y; 
} Vec2; 

// Define a simple 4-byte color 
typedef struct Color4B { 
    GLbyte r,g,b,a; 
}; 

// Define a suitable quad vertex with a color and tex coords. 
typedef struct QuadVertex { 
    Vec2 vect;    // 8 bytes 
    Color4B color;   // 4 bytes 
    Vec2 texCoords;   // 8 bytes 
} QuadVertex; 

그런 다음 네 개의 꼭지점으로 이루어진 전체 쿼드 설명하는 구조를 정의한다 : 쿼드 정점 정보를 지금

// Define a quad structure 
typedef struct Quad { 
    QuadVertex tl; 
    QuadVertex bl; 
    QuadVertex tr; 
    QuadVertex br; 
} Quad; 

당신의 쿼드를 인스턴스화하고 지정 (위치, 색상, 질감 좌표) :

Quad quad; 
quad.bl.vect = (Vec2){x,y}; 
quad.br.vect = (Vec2){w+x,y}; 
quad.tr.vect = (Vec2){w+x,h+y}; 
quad.tl.vect = (Vec2){x,h+y}; 
quad.tl.color = quad.tr.color = quad.bl.color = quad.br.color 
       = (Color4B){r,g,b,255}; 
quad.tl.texCoords = (Vec2){0,0}; 
quad.tr.texCoords = (Vec2){1,0}; 
quad.br.texCoords = (Vec2){1,1}; 
quad.bl.texCoords = (Vec2){0,1}; 

이제 쿼드를 그리는 방법을 OpenGL에 알려주십시오. gl...Pointer에 대한 호출은 정점 구조의 값에 맞는 오프셋 및 크기로 OpenGL을 제공하므로 나중에 해당 정보를 쿼드 그리기에 사용할 수 있습니다.

// "Explain" the quad structure to OpenGL ES 

#define kQuadSize sizeof(quad.bl)  
long offset = (long)&quad; 

// vertex 
int diff = offsetof(QuadVertex, vect); 
glVertexPointer(2, GL_FLOAT, kQuadSize, (void*)(offset + diff)); 

// color 
diff = offsetof(QuadVertex, color); 
glColorPointer(4, GL_UNSIGNED_BYTE, kQuadSize, (void*)(offset + diff)); 

// texCoods 
diff = offsetof(QuadVertex, texCoords); 
glTexCoordPointer(2, GL_FLOAT, kQuadSize, (void*)(offset + diff)); 

마지막으로 텍스처를 할당하고 쿼드를 그립니다. glDrawArrays4 정점으로 정의 된 모양을 그리기 위해 Quad 객체에 포함 된 값과 함께 이전에 정의 된 오프셋을 사용하도록 OpenGL에 지시합니다.

glBindTexture(GL_TEXTURE_2D, tex); 

// Draw the quad 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

glBindTexture(GL_TEXTURE_2D, 0); 

쉐이더가 필요없는 경우 OpenGL ES 1을 사용하는 것이 좋습니다. ES1과 ES2의 가장 큰 차이점은 ES2에서는 고정 된 파이프 라인이 없기 때문에 기본 렌더링을위한 쉐이더와 매트릭스 스택을 직접 구현해야한다는 것입니다. 고정 파이프 라인이 제공하는 기능을 잘 사용한다면 OpenGL ES 1을 사용하십시오.

+0

좋아,하지만 이것을 어떻게 함수로 변환 할 수 있는지 완전히 이해하지 못했다. Vec2와 같은 것은 어디에서 왔는가? - Vec2는 컴파일 할 때 'Vec2가 타입을 지정하지 않는다'는 것을 알게된다. – Skyler

+0

그의 예에서 : "(Vec2는 두 개의 float (x, y)의 구조체로 간주하고 4 바이트 (r, g, b, a)로 구조체에 색을 지정)" –

+0

방금 ​​내 대답을 편집했습니다. 지금 당신에게 더 유용합니다. 포트에 대한 템플릿으로 이것을 사용하는 것이 상대적으로 간단해야합니다. – starbugs