인터넷에 떠도는 소스를 써서 겨우 텍스쳐 로딩해서 뿌려봤는데
여전히 뭐가 뭔지 모르겠습니다.
세로모드에서 이미지를 뿌리니까 이미지가 거울에 반사된듯이 나오더라고요.
게다가 좌표계를 어떻게 써야하는지 도통 모르겠어요.
아이폰에서는 gl.glTranslatef(0.0f, 0.0f, -5.0f);
이 함수에서 첫번째 두번째 인자를 x, y 좌표로 지정하고 사용했는데요.
공개 소스에서 보면 x, y 값은 0이고 z 값이 -5.0f으로 돼 있더군요.
z값을 조절해보니 깊이 값이라서 이미지의 스케일이 조정되는 효과가 있었습니다.
전 2D 좌표계를 쓰고 싶은데 이건 아무래도 설정이 다른듯 해요.
아이폰 버전 소스를 옮겨서도 해봤는데 오류 크리 먹었습니다.
아 그런건가요.....근데 이 소스에서 왜 좌표계를 쓸수 없을까요? glTranslatef에서 x, y 값을 넣으면 너무 크게 움직여 버립니다. z축의 깊이에 따라서 움직이는거 같은데 화면 해상도와 1:1로 z축을 맞추고 좌표 값을 사용하려면 어찌해야 하는가 하는거죠. ㅠㅠ
일단.. 화면은 정상 출력하도록 했습니다.
작업순서
1. 버텍스와 텍스쳐의 값을 아래것으로 변경한다.
private float vertices[] = {
1.0f, 1.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
};
private float texture[] = {
1.0f, 0.0f, // Bottom Right
0.0f, 0.0f, // Bottom Left
0.0f, 1.0f, // Top Left
1.0f, 1.0f, // Top Right
};
2. DrawMode를 TRIANGLES에서 TRIANGLE_FAN으로 변경한다.
아래 코드는 리마크
// gl.glDrawElements( GL10.GL_TRIANGLE_FAN, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer );
아래 코드로 변경
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4);
3. 인증샷
첨부
다른 분들도 이미지 뿌리는거 하실때 도움이 되실테니 소스 받아서 수정해보세요. 공부가 되실 겁니다. 사실 엔진이란 것도 이미지 뿌리는거 끝나면 50%는 다 된거나 마찬가지입니다.
해상도 부분은 이렇게 해 봤습니다.
화각인 gluPerspective의 처리 위치를 변경했습니다.
음. OpenGL은 설정이 순서에 민감하다고 하더라구요.
그 순서 틀어지면 이전 설정값이 초기화되는 경향이 있는듯해요.
음. 순서에 대한 설명은.. 좀 어렵지만.. 해상도에 맞도록 변경이 되네요
1. onSurfaceChanged 수정
@Override
public void onSurfaceChanged( GL10 gl, int width, int height )
{
// if ( height == 0 ) height = 1;
gl.glViewport( 0, 0, width, height );
gl.glMatrixMode( GL10.GL_PROJECTION );
gl.glLoadIdentity();
gl.glMatrixMode( GL10.GL_MODELVIEW );
gl.glLoadIdentity();
GLU.gluPerspective( gl, 45.0f, (float)width / (float)height, 0.1f, 100.0f ); //<== 위치를 변경함
}
2. onDrawFrame() 의 Translaterf 리마크
@Override
public void onDrawFrame( GL10 gl )
{
gl.glClear( GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT );
gl.glLoadIdentity();
gl.glClearColor( 0.3f, 0.3f, 0.3f, 1.0f );
// gl.glTranslatef( 0.0f, 0.0f, -6.0f );
gl.glScalef( 1.0f, 1.0f, 1.0f );
sample.DrawTexture( gl );
//PutTexture( gl, 0, 0, 128, 128 );
}
3. 결과.
해상도에 꽉 차게 바둑판이(타일판)이 나오네요.
오 멋집니다.....근데 제가 하려던 결과는 저 이미지 자체가 128x128짜리 이미지니까 이미지 사이즈 그대로 나오게 하고 싶었던 겁니다. 480x800짜리 화면이라면 (0, 127, 0, 127) 영역에만 뿌려지는거죠. 아핫핫~
좀 무식한 방법으로 이미지 사이즈를 화면 비율로 나눠서 gl.glScalef( 128.0f / 480.0f, 128.0f / 800.0f, 1.0f ); 이렇게 스케일 조정을 하면 이미지 원래 사이즈대로 나오긴 합니다. 다만 이건 그냥 편법이라 그냥 해본거고요. 정공법이 따로 있을거 같네요.
3차원 물체를 2차원 물체로 표현하기 위한 방법은 기본적으로 아래의 방법이 있다고 합니ㅏㄷ.
투영
glPerspective : 화각을 지정 한다. (광각, 망원 ) - 3차원 이미지를 2차원 이미지로 눌러 보는 형태
관측
gluLookAt: 카메라위 위치, 렌즈의 방향, 상하뒤집어짐
뷰포트
glViewPort: 매핑할 윈도우 (일반적으로 해상도와 일치 시킴)
glPerspectvie와 gluLootAt를 통해서 사물의 원근감, 각도 등을 조절 할 수 있는 듯 하네요.
흐음.
APIDemo를 좀 뒤져봤는데 이미지를 2D 좌표계에 뿌리는 샘플은 따로 없네요. Textured Triangle이 그나마 가장 가까운데 이것 역시 좌표계에 대한 부분은 없는거 같아요....골 아프넹...ㅎㅎ
이것저것 바꾸다 보니 기존의 코드를 너무 변형시킨듯 합니다 ㅜㅜ
주석처리를 안해놓고 삭제시켜버린 소스도 있구요...죄송 ㅠ,.ㅠ
어쨋든 Texture 클래스에 drawAtPointLT(GL10 gl, float x, float y); 메서드를 추가시켜놓았구요
x,y좌표를 보내주면 이미지 좌상단을 기준으로 출력이됩니다..
근데 이거 찾으시는게 맞는지.. 잘모르겠네요....
아 BIGo님 베라뷰님 이 스터디의 정신적 지주가 되실듯.....완벽하게 잘 됩니다. 이걸 수정해서 저같은 초보님들이 이용하실 수 있게 샘플을 만들고 있습니다. 오늘 저녁에 올리도록 할게요.
아이폰에선 float texture[] 행렬에 128x128 텍스쳐 내에서 출력하고 싶은 부분의 영역값을 넣어서 일부분만 뿌리는게 가능했는데 안드로이드에선 불가능한건가요? 행렬 구조가 좀 다르네요. 정 안되면 이미지에서 일부분만 뽑아서 Bitmap을 만든 후에 그걸로 텍스쳐를 생성하면 되긴 하겠습니다만.....
음....부분 영역 값을 전체 텍스쳐 길이로 나눠서 그걸 행렬에 사용하면 거의 같은 결과가 나오기는 하네요. 그거에 맞춰서 vertex 행렬에 사용된 출력 영역 사이즈도 같이 줄여줘야 되고요.




다운 받아보시고 뭐가 문제인지 지적해주시면 감사하겠습니다. 이걸 다듬으면 다른 분들께도 좋은 자료가 될거 같은데 말예요.