본문 바로가기

프로그래밍/Android

OpenGL es 조명

 

> 조명 종류

주변광(ambient) : 특정한 방향성이 없는 빛, 오브젝트의 모든 면에 영향을 미치고 밝기도 동일

분산광(diffuse) : 특정 방향에서 들어와 여러 방향으로 반사되는 빛. 빛을 직접 받는 부분일수록 밝아진다.

반사광(specular) : 특정 방향에서 들어와 특정 방향으로 반사되는 빛.

 

 

> 노말벡터

방향성이 있고, 특정방향으로 반사되는 조명의 경우

기존 모델에 노말벡터를 위한 버퍼가 추가로 필요하다.

노말 벡터는 길이가 1인 단위벡터로 빛의 정도와 반사를 계산하기 위해 필요한 정보.

버텍스와 같이 glVertex / glNormal 로 쌍으로 구성하거나 , array의 포인터를 전달하면 된다.

 

 

 

> 라이팅 활성화

glEnable( GL10.GL_LIGHTING );

 

 

> 사용할 라이트 번호(0~7) 활성화

glEnable( GL_LIGHT0 );

 

> 광원 설정

glLightfv( 조명번호, 파라미터명, 파라미터  )

조명번호 : GL_LIGHT0 ~ GL_LIGHT7

파라미터명 :

GL_AMBIENT / GL_DIFFUSE / GL_SPECULAR

GL_POSITION : 위치 x, y, z, w( 0: 거리 제한이 없는 빛, 1: point light )

GL_SPOT_CUTOFF

GL_SPOT_DIRECTION : 방향 x, y, z

GL_SPOT_EXPONENT

 

> 재질

glMaterialfv( 면 , 파라미터명, 파라미터)

면 : GL_FRONT / GL_BACK / GL_FRONT_AND_BACK

파라미터명(기본값)

GL_AMBIENT : 주변광의 반사 정도( 0.2, 0.2, 0.2, 1.0 )

GL_DIFFUSE : 분산광의 반사 정도 (0.8, 0.8, 0.8, 1.0 )

GL_SPECULAR : 반사광의 반사 정도 (0, 0, 0, 1)

GL_EMISSION : 방출 속성( 0, 0, 0, 1)

GL_SHININESS : 반사광 정도 ( 0 ~ 128 )

 

 

 

> 예제

1. 색상용 배열 선언

float [] ambient = { 0.5f, 0.5f, 0.5f, 1.0f };

float [] diffuse = { 1.0f, 1.0f, 1.0f, 1.0f };

float [] position = { 0, 0, 10.0f, 1.0f };

 

// 안드로이드는 glLightfv 의 파라미터입력을 FloatBuffer로 받으므로

// ByteBuffer를 생성.(float 배열을 사용하는 메쏘드도 제공됨.)

FloatBuffer bufAmbient;

FloatBuffer bufDiffuse;

FloatBuffer bufPosition;

 

 

ByteBuffer byteBuf = ByteBuffer.allocateDirect( ambient.length * 4 );

byteBuf.order( ByteOrder.nativeOrder() );

bufAmbient = byteBuf.asFloatBuffer();

bufAmbient.put( ambient );

bufAmbient.position(0);

 

byteBuf = ByteBuffer.allocateDirect( diffuse.length * 4 );

byteBuf.order( ByteOrder.nativeOrder() );

bufDiffuse = byteBuf.asFloatBuffer();

bufDiffuse.put( diffuse );

bufDiffuse.position( 0);

 

byteBuf = ByteBuffer.allocateDirect( position.length * 4 );

byteBuf.order( ByteOrder.nativeOrder() );

bufPosition = byteBuf.asFloatBuffer();

bufPosition.put( position );

bufPosition.position(0);

 

2. 노말 버퍼 생성

모델의 버텍스와 매칭되는 노말버퍼를 생성한다.

FloatBuffer bufNormal;

float [] normals = { 0.0f, 0.0f, 1.0f,

0.0f, 0.0f, 1.0f,

0.0f, 0.0f, 1.0f,

.

.

};

 

ByteBuffer byteBuf = ByteBuffer.allocateDirect( normals.length * 4 );

byteBuf.order(ByteOrder.nativeOrder());

bufNormal = byteBuf.asFloatBuffer();

bufNormal.put( normals );

bufNormal.position( 0 );

 

 

3. 라이팅 활성화

gl.glEnable( GL10.GL_LIGHTING );

 

4. 라이팅 설정

gl.glLightfv( GL10.GL_LIGHT0, GL10.GL_AMBIENT, bufAmbient );

gl.glLightfv( GL10.GL_LIGHT0, GL10.GL_DIFFUSE, bufDiffuse );

gl.glLightfv( GL10.GL_LIGHT0, GL10.GL_POSITION, bufPosition );

 

float[] direction = { 0, 0, -10 };

gl.glLightfv( GL10.GL_LIGHT0, GL10.GL_SPOT_DIRECTION, 

 

5. 재질 설정(기본값이 아닌 값을 사용할때 설정 )

float [] matAmbient = { 1.0f, 1.0f, 1.0f, 1.0f };

gl.glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient );

.

.

 

 

 

6. 모델뷰 변환 시 라이팅 활성화

gl.glMatrixMode( GL10.GL_MODELVIEW );

gl.glLoadIdentity();

 

gl.glEnable( GL10.GL_LIGHT0 );

 

// 모델 그리기

.

.

gl.glEnableClientState( GL10.GL_NORMAL_ARRAY );

.

.

gl.glNormalPointer( GL10.GL_FLOAT, 0, bufNormal);

.

.

gl.glDrawElements( ... );

'프로그래밍 > Android' 카테고리의 다른 글

Parcelable  (0) 2012.05.22
Data Animation???  (0) 2012.04.18
Assets 폴더의 이미지 읽기  (0) 2012.03.15
JSON  (0) 2012.01.31
HTTP POST/GET 몇가지 정리  (0) 2012.01.30
API demos openGL es 2.0  (0) 2011.11.21
GLSurfaceView 배경 투명하게  (1) 2011.11.04
최상위 뷰 만들기  (0) 2011.10.27
OpenGL 프레임버퍼 사용  (0) 2011.10.27
ADB tcp/usb 연결설정  (0) 2011.10.26