> 조명 종류
주변광(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 |