2010-02-16 4 views
4

OpenGL ES 응용 프로그램에서 배경 이미지를 표시 할 때 권장되는 방법은 무엇입니까?OpenGL ES에서 배경 이미지를 표시 할 때 권장되는 방법

  1. glview 아래에 계층 구조를보기 위해 UIImage가 추가 되었습니까?
  2. 이미지가 메모리의 텍스처에서 OpenGL 그리기 루틴으로 그려 집니까?

성능/메모리 고려 사항은 있습니까?

+1

EAGLView 아래에 아무것도 렌더링하지 마십시오. EAGLView가 투명하게 표시되어야하므로 성능이 저하됩니다. – Till

답변

3

Apple의 Texture2D 클래스를 사용하여 텍스처를로드하고 싶습니다. 화면 모서리에 매핑되는 쿼드 (두 개의 삼각형, 여섯 개의 꼭지점)를 만듭니다. 그런 다음 텍스처 좌표를 정점에 매핑하고 glDrawArrays로 전달한 다음 이동합니다. 사실 CG 좌표계에서 프레임을 가져 와서 OpenGL 좌표로 변환 한 다음 프레임의 이미지를 그려주는 클래스가 있습니다.

struct { 
    GLfloat x;    // OpenGL X Coordinate 
    GLfloat y;    // OpenGL Y Coordinate 
    GLfloat z;    // OpenGL Z Coordinate 
    GLfloat s;    // Texture S Coordinate 
    Glfloat t;    // Texture T Coordinate 
} vertexData; 

그리고이 같은 정점 데이터의 배열 :

struct vertexData verts[6]; 

그리고 당신은 Texture2D 객체가 있습니다

texture = [[Texture2D alloc] initWithImage:[UIImage imageNamed:image] filter:filter pixelFormat:pixelFormat]; 

의가이 같은 구조체가 있다고 가정 해 봅시다 이제 정점 배열을 채워야합니다. 3D, X 범위를 가정하면 [-1, 1]와 y 범위 [-1, 1] Z를 들어, 원산지, 당신은이처럼 정점을 초기화 할 것 :

verts[0].x = verts[1].x = verts[5].x = -1.0; 
verts[2].x = verts[3].x = verts[4].x = 1.0; 

verts[0].y = verts[2].y = verts[4].y = 1.0; 
verts[1].y = verts[3].y = verts[5].y = -1.0; 

verts[0].z = verts[1].z = verts[2].z = 0.0; 
verts[3].z = verts[4].z = verts[5].z = 0.0; 

verts[0].s = verts[1].s = verts[5].s = tlxf; 
verts[2].s = verts[3].s = verts[4].s = trxf; 

verts[0].t = verts[2].t = verts[4].t = ttyf; 
verts[1].t = verts[3].t = verts[5].t = tbyf; 

마지막으로, 당신이 그릴 필요 :

glBindTexture(GL_TEXTURE_2D, texture.name); 
glVertexPointer(3, GL_FLOAT, sizeof(struct vertexData), &verts[0].x); 
glTexCoordPointer(2, GL_FLOAT, sizeof(struct vertexData), &verts[0].s); 
glDrawArrays(GL_TRIANGLES, 0, 6); 

OpenGL 설정에 대한 세부 정보는 생략합니다. 네가 이렇게 멀리까지 간다면 너도 그렇게했다고 생각해.

OpenGL에서 작업 할 때 고려해야 할 많은 성능과 메모리 제약이 있지만, 아직 너무 걱정스러운 것은 아닙니다. 일단 작동 시키면 OpenGL Instrument로 프로파일 링하여 성능 문제가 있는지 확인한 다음 문제를 처리하십시오.

Apple에게는 모범 사례를 설명하는 문서가 정말 많이 있으며, 유용한 정보도 있습니다. 자신이 무엇에 반대하는지 알게되면 검색 할 수있을 것입니다.

+1

그리고이 모든 것은 배경 이미지 용 일뿐입니다 ... .. glDrawTexOES는 배경 이미지보다 훨씬 편리합니다. 배경 이미지에 대해 손으로 코드화 된 쿼드를 사용하면 잔인합니다. –

+0

내가 수업에서 모두 포장했다고 말한 부분을 놓치셨습니까? 배경 이미지를 그리는 것은 이미지를 그리는 특별한 경우 일 뿐이니까요. 나는 전체 수업을 발표하기보다는 작곡을 위해 약간 해체하려고 노력했다. –

+1

"내가 수업에서 모두 포장했다고 말한 부분을 놓치셨습니까?" 래퍼를 사용하는 것이 좋지만, 불필요한 작업으로 OpenGL ES 스택을 공격하는 것은 그리 좋지 않습니다. –

2

glDrawTexOES이 최선의 선택입니다.

+0

감사합니다. OES는 무엇을 의미합니까? 아이폰이나 OpenGL에서 일반적으로 opengles을 목표로합니다. 어떤 예제 코드가 떠 다니고 있습니까? – PeanutPower

+0

http://iphone-3d-programming.labs.oreilly.com/ch07.html#ch07_id35816945 에서 예제를 참조하십시오. "이 확장은 OpenGL ES 2.0에서 지원되지 않습니다." iPhone 3GS. –

+0

왜 이것이 최선의 선택입니까? –

관련 문제