프로그래밍/OpenGL-ES2011. 1. 22. 13:00

이전글에서 사용한 프로젝트에서 텍스쳐를 붙혀볼랍니다.

프로젝트 첨부하였습니다.(N드라이브에서 파일을 올리니 올려지는구나 ~)







1.우선 사용할 텍스쳐를 추가합니다.

문제는 사용해야할수있는 텍스쳐의 사이즈가 정해져있습니다.

그거슨 2의 제곱....

Icon.png는 72x72의 사이즈 이고

Lena256.png는 파일명대로 256x256 입니다.

텍스쳐 싸이즈가 2의 제곱이 아닐경우 2의 제곱으로 만들어 줘야하나 생략합니다;

(애플 공식샘플에 존재하나 구글에서 찾는게 더 빠르니 nextPOT 으로 검색 )  POT는 -Power Of Two


그리고 텍스쳐를 읽어들이기 위해 CoreGraphics.framework를 추가해야합니다.

혹 CoreGraphics.framework 추가를 까먹고 빌드를 하면

_CG~궁시렁~  이런 에러가 나오는데 

프렘웤이나 라이브러리 추가안햇을경우의 에러출력 방식을 알수있기에 그냥 빌드해보시길 바랍니다;








2.텍스쳐읽어들이는 소스가 좀 길어서 새로 메쏘드를 작성합니다.

그리고 멤버변수인 텍스쳐 오브젝트도 같이 만들어 줍니다.





3.텍스쳐를 읽어들이기 전에 해야할일은

사용한 텍스쳐 삭제하기 입니다.

나중에 하면 까먹는 일이 많으니 제일먼저 해줍니다;






4.텍스쳐 로딩하기

간단하게 텍스쳐를 사용하기위한 멤버변수와 텍스쳐 파일명을 건네줍니다.(66,71라인)

넘겨준 멤버변수에 저장이 되기에 포인터로 넘겨줍니다.

로딩에 실패했을경우 NO가 반납되어

assert()에서 프로그램강제 종료되게 하였습니다.(69,74라인)






5.텍스쳐 로딩 메쏘드

UIImage로 텍스쳐를 가져오고있으나(482라인)

간단하게 하기위해 일단 캐쉬가 남는 imageNamed을 사용.

게임에서 쓸려면 imageWithData를 사용해야합니다.


픽셀 데이터를 저장하기 위해 malloc으로 메모리생성 (489라인)

메모리생성 했으니 반납하는것도 안까먹기 (497,564라인)

아이폰 아이패드용 텍스쳐 로딩처리(491 ~ 521 라인)


OpenGL에서의 텍스쳐 생성과 옵션설정(525 ~ 552 라인)

간혹 필터링 설정을 안하는 샘플이 있는데(529,531 라인)

에뮬레이터에서는 잘되는데 디바이스에서는 안되는 경우가 많습니다.

필터링도 종류가 많으니 옵션을 바꿔가면서 직접 눈으로 확인하는게 좋습니다.

( GL_LINEAR는 고퀄리티 속도저하/ GL_NEAREST는 저퀄리티 속도상승 )


어드레싱에 대해선 다음번에 쓸 atlas에서 쓰기로 하고(536라인)


환경설정은 GL_MODULATE가 디폴트 설정에 사각형 색상 무시 텍스쳐 출력이고(543라인)

GL_DECAL을 사용하면 사각형의 색깔과 텍스쳐의 그림이 같이 출력됩니다.


알파채널을 사용하는 GL_RGBA를 사용하니 블렌딩을 유효화(547라인)


마지막으로 GPU에게 전송하면 텍스쳐를 사용할 준비가 끝납니다.(552라인)





6.텍스쳐 좌표 설정

레나는 왼쪽위에구석을 기준으로 256싸이즈로 출력(197라인)

아이콘은 왼쪽밑에구석을 기준으로 72싸이즈로 출력되게 수정.


저번에 귀찮아서 생략한 색상도 추가하고(230라인)

4개의 정점의 색깔을 흰색으로 수정.


이번에 텍스쳐출력을 위해 텍스쳐좌표를 새롭게 작성.(243라인)

텍스쳐싸이즈가 1024픽쎌이던 32픽쎌이던 1.0이 최대싸이즈 입니다.

이건 다음에 쓸 atlas에서 다시 설명하겠습니다.

텍스쳐도 알기쉽게 퀘변조로의 Z 의 순서로 작성합니다.

소스 코멘트에서도 적었듯이 좌표로 치자면 x,y를(244라인)

다이렉트X에서는 u,v로 쓰고

오픈쥐엘에서는 s,t로 쓰나 둘다 같은놈입니다.


좌표랑 색상쓰려고 했던것처럼 텍스쳐도 똑같이 해줍니다(282라인)


glEnable(GL_TEXTURE_2D)을 써서 텍스쳐를 사용할것이라는걸 알리고(286라인)

텍스쳐생성할때 사용하였던 glBindTexture()를써서 사용할 텍스쳐오브젝트를 선택합니다(289라인)

첨에 mTexture를 바인드해서 사각형을 출력하였고(레나)

그담음엔 mTexture2를 바인드해서 사각형을 출력하였습니다.(아이콘)


기본적으로 렌더링이 끝나면 이 메쏘드에서 렌더링할때 유효화했던 스테이트를 원래상태로 돌려줍니다.(300~305라인)





이걸루 간단하게 텍스쳐를 출력해보았습니다.


위에처럼 텍스쳐를 쭈욱사용할경우 glEnable(GL_TEXTURE_2D)를 

텍스쳐 로딩할때 한번만 써줘서 286라인 생략가능합니다.(블렌드처럼)

그리고 glEnableClientState도 텍스쳐 로딩끝나고 한번만 설정해주면

매번 다시 설정할 필요는 없습니다.


단, 다른곳에서 glDisable을 안할경우에 해당됩니다. ㅎ_ㅎ;


다음엔 간단 텍스쳐 atlas를 해볼랍니다;

Posted by windship