재질 무늬

재질 무늬 는 물체 표면의 디 테 일 을 증가 시 키 는 효과 적 인 수단 이다.앞에서 우 리 는 이미 임의의 복잡 한 3 차원 모델 을 불 러 올 수 있 지만, 하 얀 덩어리 는 보기에 조금도 멋 있 지 않다. 이 제 는 그것 을 좀 예 쁘 게 할 때 가 되 었 다.
첫 번 째 단 계 는 우리 가 그것 에 색 을 좀 칠 하 는 것 이다.먼저 우 리 는 빛 모델 에 대해 약간의 개념 을 가 져 야 한다. 물 체 는 색깔 이 있어 보이 고 빛 에 비 친 결과 이다. 만약 에 빛 이 흰색 이 라면 물체 자체 의 색깔 을 나타 내 는 것 이다. 그렇지 않 으 면 빛 과 표면 본색 이 종합 적 인 결과 가 될 것 이다.물체 표면 이 점 광원 에 비 친 후에 세 개의 구역 이 나타난다. 하 이 라이트 구역, 과도 색 구역 과 환경 색 구역 이다.고광 구 는 거울 면 의 반사 결과 로 밝기 가 매우 높 고 광원 이 강 할 수록 뚜렷 하 다.과도 색 구역 은 난반사 의 결과 로 보통 면적 이 비교적 크다.환경 색 구역 은 빛 을 받 지 않 는 부분의 색 으로 보통 어둡다.
OpenGL ES 는 물체 표면 에 이 세 구역 의 색 을 지정 할 수 있 도록 API 를 제공 합 니 다.
void glMaterialx(GLenum face, GLenum pname, GLfixed * param);

이 인터페이스의 사용 은 다음 과 같다.
GLfixed specmat[4] = { 1<<16, 0, 0, 0 };
GLfixed diffmat[4] = { 0, 1<<16, 0, 0 };
GLfixed ambmat [4] = { 0, 0, 1<<16, 0 };

glMaterialxv( GL_FRONT, GL_SPECULAR, specmat );
glMaterialxv( GL_FRONT, GL_DIFFUSE, diffmat );
glMaterialxv( GL_FRONT, GL_AMBIENT, ambmat );
... draw code ...


이전 "로드 모델" 예제 프로그램 에서 상기 소 재 를 사용 한 후의 효과:
그림.
색상 이 빛 과 이렇게 밀접 한 관 계 를 가 진 이상 다음 두 줄 의 코드 를 사용 하지 않 으 면 주의 하 십시오.
glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );


빛 을 사용 하여 계산 하면 그 결 과 는 다음 과 같 습 니 다.
그림: 재료 가 있 지만 조명 이 없 는 드로잉 모델
"Hello EGL" 예 를 보 았 다 면, 일조 계산 을 사용 하지 않 을 때 도 바로 COLOR 을 사용 할 수 있 음 을 발견 할 수 있 습 니 다.ARRAY 는 표면 에 색칠 을 하지만, 일반적인 의미 의 소 재 는 아니다.
모형 표면 에 색칠 을 한 후에 훨씬 예 뻐 보이 지만 복잡 한 표면 디 테 일 을 표현 하기 에는 부족 하 다. 만약 에 물체 표면 이 대면 적의 색 덩어리 가 아니 라 복잡 한 무늬 라면 무늬 스티커 를 통 해 표현 해 야 한다.실제로 텍 스 처 스티커 는 게임 류 그래 픽 프로그램의 가장 중요 한 작업 이다. 엔 터 테 인 먼 트 시장 에서 개발 한 디 스 플레이 카드 의 최적화 중점 도 그래 픽 카드 의 버스 대역 폭 을 증가 하여 더욱 빠 른 속도 로 그래 픽 스티커 를 시스템 메모리 에서 그래 픽 처리 라인 으로 전달 하고 무늬 에 따라 모든 픽 셀 의 최종 색 채 를 계산 하 는 것 이다.전문 그래 픽 카드 라 는 것 은 라인 등 기본 적 인 그림 을 더욱 중시한다.
... 에 있다 OpenGL ES 에서 한 면 에 지정 한 무늬 는 네 단계 입 니 다.
메모리 에 텍 스 처 데 이 터 를 준비 하 세 요. glTexImage2D 를 호출 하여 텍 스 처 데 이 터 를 그래 픽 카드 에 업로드 하고 현재 텍 스 처 를 설정 합 니 다. 스티커 매개 변 수 를 설정 합 니 다. 면 을 그 릴 때 텍 스 처 좌표 (uv) 를 제공 합 니 다.
OpenGL ES 는 텍 스 처 이미지 의 길이 와 폭 을 모두 2 의 차방 으로 제한 하고 길이 와 폭 은 다 를 수 있다.다음 코드 는 128 x128 그림 을 만 들 고 배열 embText 에 저장 합 니 다.
 1      unsigned short embTex[128*128];
 2      unsigned short color[4]={ 0xF800, 0x7E0, 0x1F, 0xffff };
 3      for ( int i = 0; i < 128; ++i )
 4      {
 5          for ( int j = 0; j < 128; ++j )
 6          {
 7              embTex[i*128+j] = color[(i/32 + j/32)%4];
 8          }
 9      }
10


실제 응용 에서 무늬 그림 은 보통 클로즈업 형식의 파일 에서 읽 어야 한다. tga 와 같은 파일 형식 은 비교적 간단 하지만 jpg / gif 는 상당히 복잡 하지만 압축 률 이 높다. 대부분의 게임 은 사용자 정의 형식의 파일 을 사용 하기 때문에 필요 에 따라 형식 을 최적화 할 수 있 을 뿐만 아니 라 간단 한 자원 보호 도 제공 할 수 있다.
텍 스 처 데 이 터 를 메모리 에 넣 으 면 glTex Image2D 를 사용 하여 디 스 플레이 에 업로드 하고 흐름 선 에 '현재' 텍 스 처 로 알려 줍 니 다.
11 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 128, 128 , 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, embTex);


매개 변수의 의 미 는 상당히 직접적 이다.
target: GL_TEXTURE_2D 는 2 차원 무늬 를 정의 하 는 것 을 나타 내 는데 사실은 이것 은 현재 이다. OpenGL ES 가 지원 하 는 유일한 값;
level: LOD 급수, 각 레벨 LOD 무늬 는 상급 무늬 의 길이 와 너비 가 각각 반 으로 줄 어 든 그림 입 니 다.만약 에 이 무늬 를 사용 하 는 면 이 거리 나 각도 로 인해 실제 적 으로 볼 수 있 는 면적 이 매우 작 기 때문에 흐름 선 은 적당 한 등급 의 무늬 로 그 려 서 실시 간 으로 그림 을 축소 하 는 데 필요 한 대량의 계산 을 피 할 수 있다.
internalFormat: 내부 형식 으로 텍 스 처 의 색상 성분 수 를 지정 하고 GL 처럼 사용 합 니 다.RGB 와 같은 기호 상수.상상 할 수 있다 OpenGL ES 는 몇 가지 가장 자주 사용 하 는 형식 만 지원 합 니 다.쉽게 말 하면 이 매개 변 수 는 텍 스 처 가 디 스 플레이 에 있 는 형식 을 정의 합 니 다.뒤에 또 하나의 format 가 있 습 니 다. 그것 은 메모리 의 형식 을 설명 하 는 것 입 니 다.
width, height: 경계 가 없 을 때 는 2n 이 어야 하고 경계 가 있 을 때 는 2n + 2 가 있어 야 합 니 다.
border: 경계 너비, 0 또는 1 이 어야 합 니 다.경계 가 있 는 무늬 를 사용 하면 연결 할 때의 틈 을 해결 하 는 데 도움 이 되 지만, OpenGL ES 1.0 은 지원 되 지 않 습 니 다.OpenGL 지원 하 는 텍 스 처 크기 는 매우 제한 되 어 있 습 니 다. 여러 텍 스 처 로 큰 그림 을 만들어 야 할 수도 있 습 니 다. Linear 와 같은 스티커 알고리즘 은 스 티 치 에 있 는 픽 셀 과 인접 한 픽 셀 을 평균 적 으로 해 야 하기 때문에 다음 스티커 에 있 는 픽 셀 을 경계 에 놓 으 면 전체 그림 과 같은 효 과 를 얻 을 수 있 습 니 다.그렇지 않 으 면 뚜렷 한 틈새 가 생 길 수 있다.
format: 업로드 할 픽 셀 데이터 형식, GLRGB 등 은 모두 옛 이름 으로 의 리 를 생각 할 수 있다.마찬가지 로 OpenGL ES 1.0 은 가장 많이 사용 되 는 RGB, RGBA, LUMINANCE 만 지원 합 니 다.ALPHA,ALPHA。
type: 업로드 할 픽 셀 의 데이터 형식 입 니 다.GL_UNSIGNED_BYTE 는 무늬 가 8bit 바이트 시퀀스 임 을 나타 낸다.GL_UNSIGNED_SHORT_5_6_5 는 16bit 자 서열 을 나타 내 는데 그 중에서 첫 5 위 는 Red 분량 을 기록 하고 중 6 위 는 Green 분량 을 기록 하 며 마지막 5 위 는 Blue 분량 을 기록한다.
pixel: 실제 텍 스 처 데이터.
여기에 몇 가지 주목 할 만 한 점 이 있다.
embTex 는 이 명령 을 실행 한 후에 사용 하지 않 습 니 다. 동적 으로 분 배 된 메모리 라면 free / delete 할 수 있 습 니 다.데 이 터 는 이미 메모리 에 업로드 되 었 다.
유수 선 은 하나의 '현재' 무늬 만 있 을 뿐, 그리 기 전에 여러 개의 glTex Image3D 를 호출 하면 마지막 으로 만 작 동 합 니 다.
glTexImage 한 무늬 가 반복 적 으로 사용 되면 호출 할 수 있 습 니 다
glGenTextures(count, &id);
glBindTexture(GL_TEXTURE_2D, id);


ID 를 지정 합 니 다. 필요 할 때
glActiveTexture(id);

다시 '현재' 무늬 로 설정 할 수 있 습 니 다.이렇게 하면 무늬 무늬 데 이 터 를 중복 업로드 하 는 비용 을 줄 일 수 있다.
스티커 프로 세 스 를 제어 하 는 매개 변 수 는 주로 다음 과 같 습 니 다.
glEnable (GL TEXTURE 2D): disable 이면 3 차원 그래 픽 흐름 선 은 텍 스 처 스티커 를 완전히 무시 합 니 다. 기본 값 은 disable 입 니 다.
glTex Parameterx (GL TEXTURE 2D, param, value): 직접 생 성 된 회절 격자 와 텍 스 처 픽 셀 점 이 일일이 대응 하지 못 할 때 어떻게 처리 합 니까?
GL_TEXTURE_WRAP_T / S: 종횡 방향 에서 크기 가 일치 하지 않 을 때 무늬 좌표 (uv) 를 어떻게 조정 합 니까?
기본 GLREPEAT 는 텍 스 처 를 중복 사용 하기 위해, GL_CLAMP 는 uv 좌 표를 [0, 1.0] 이내 로 축소 하기 위해 GL_CLAMP_TO_EDGE 는 uv 좌 표를 [1 / (2 * size), 1 - 1 / (2 * size)] 사이 로 축소 합 니 다.
GL 만CLAMP 시 경계 에 있 는 텍 스 처 에 만 접근 할 수 있 습 니 다.

GL_TEXTURE_MIN_FILTER: 텍 스 처 축소 알고리즘.면전 에서 생 성 된 픽 셀 이 무늬 화 과정 에서 무늬 에 비 친 픽 셀 이 한 픽 셀 보다 큰 구역 에 비 쳤 을 때 이 매개 변 수 는 여러 개의 무늬 픽 셀 을 합 쳐 최종 적 으로 면 에 적용 되 는 색 을 만 드 는 방법 을 선택 합 니 다.GL_NEAREST 는 가장 가 까 운 픽 셀 로 GLLINEAR 은 주변 최근 네 개의 텍 스 처 픽 셀 가중 평균, GL *A*_MIPMAP_*B * 는 * B * 에 따라 적당 한 MIPMAP 급 을 선택 한 다음 에 * A * 로 가장 가 까 운 것 을 선택 하거나 계산 하 겠 다 고 밝 혔 다.
GL_TEXTURE_MAG_FILTER: 텍 스 처 증폭 알고리즘.민 이와 반대 되 는 상황.GL 만NEAREST/GL_리 니 어 두 가지 선택.

glTexEnvx: 이것 은 비교적 복잡 합 니 다. 수첩 참조 가장 흔히 볼 수 있 는 방법 은 다음 과 같다.
glEnable(GL_TEXTURE_2D);
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);


지금 은 만사 가 다 준비 되 었 으 니 그림 을 그 릴 뻔 했다.... 때문에 OpenGL ES 는 vetex array 방식 으로 모델 데 이 터 를 보 내 는 것 만 지원 합 니 다. 이 단 계 는 한 가지 일 만 할 수 있 습 니 다. 모델 에 uv 좌 표를 추가 합 니 다.
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glTexCoordPointer( components, GL_FIXED, stride, uvPointer );

주의: 무늬 좌표 (uv) 는 정점 좌표계 의 습관 과 약간 다 릅 니 다. 그 원점 은 그림 의 왼쪽 아래 에 있 고 왼쪽 에서 오른쪽 은 정 u 방향 이 며 바닥 에서 정상 까지 는 정 v 방향 입 니 다.
완전한 형식의 무늬 좌 표 는 (s, t, r, q) 로 나 타 낼 수 있 는데 그 중에서 (s, t) 는 일반 3 차원 모델 링 소프트웨어 중의 uv, 즉 평면 무늬 이미지 의 (x, y) 에 대응 할 수 있다.r 3 차원 텍 스 처 사용 시, OpenGL ES 는 현재 3 차원 무늬 를 지원 하지 않 고 0 으로 설정 해 야 한다.q. 차례 좌표 로 보통 1 이 며, 좌표 변환 계산 과정 에서 1 이 아 닌 값 을 사용 할 수 있 습 니 다.
다음은 완전한 예 이다.
 1  void testTexture()
 2  {
 3      GLfixed rect[] = { Float2Fixed(-1.0f), Float2Fixed(-1.0),0,
 4                    Float2Fixed(1.0f), Float2Fixed(-1.0), 0,
 5                    Float2Fixed(1.0f), Float2Fixed(1.0), 0,
 6
 7                    Float2Fixed(-1.0f), Float2Fixed(-1.0),0,
 8                    Float2Fixed(1.0f), Float2Fixed(1.0), 0,
 9                    Float2Fixed(-1.0f), Float2Fixed(1.0f) , 0
10                   };
11      GLfixed rnormal[] = {
12                      0, Float2Fixed(1.0f), 0,
13                      0, Float2Fixed(1.0f), 0,
14                      0, Float2Fixed(1.0f), 0,
15
16                      0, Float2Fixed(1.0f), 0,
17                      0, Float2Fixed(1.0f), 0,
18                      0, Float2Fixed(1.0f), 0 };
19      GLfixed rectuv[] = { Float2Fixed(0.0f), Float2Fixed(0.0),
20                       Float2Fixed(1.0f), Float2Fixed(0.0),
21                       Float2Fixed(1.0f), Float2Fixed(1.0),
22
23                       Float2Fixed(0.0f), Float2Fixed(0.0),
24                       Float2Fixed(1.0f), Float2Fixed(1.0),
25                       Float2Fixed(0.0f), Float2Fixed(1.0f) };
26
27      unsigned short color[4]={ 0xF800, 0x7E0, 0x1F, 0xffff };
28
29      for ( int i = 0; i < 128; ++i )
30      {
31          for ( int j = 0; j < 128; ++j )
32          {
33              embTex[i*128+j] = color[(i/32 + j/32)%4];
34          }
35      }
36
37      glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
38      glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
39      glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
40      glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
41
42      glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB,  128, 128 , 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, embTex);
43
44      glEnableClientState( GL_VERTEX_ARRAY );
45      glEnableClientState( GL_NORMAL_ARRAY );
46      glEnableClientState( GL_TEXTURE_COORD_ARRAY );
47      glVertexPointer( 3, GL_FIXED, 0, rect );
48      glNormalPointer( GL_FIXED, 0, rnormal);
49      glTexCoordPointer( 2, GL_FIXED, 0, rectuv );
50
51      glDrawArrays( GL_TRIANGLES, 0, 6);
52  }
53


다음 그림 과 같이 실행 효과:
위의 그림 에서 알 수 있 듯 이 왼쪽 위의 첫 번 째 칸 은 무늬 그림 왼쪽 위의 첫 번 째 칸 의 빨간색 이 아니 라 흰색 이다. 만약 에 무늬 좌표 중의 v 의 0. 0, 1.0 을 바 꾸 면 완전히 같다.OpenGL 때 문 이에 요. ES 는 2 차원 텍 스 처 이미지 데 이 터 를 아래 에서 위로 한 줄 씩 저장 하도록 규정 하고 예제 프로그램 에서 생 성 된 데 이 터 는 위 에서 아래로 한 줄 씩 저장 합 니 다.
여기 서 소 개 된 것 은 표면 재질 의 무늬 효과 에 대한 기초 지식 이다. 현재 재질 과 스티커 는 실시 간 응용 에서 높 은 진실 감 효 과 를 얻 는 주요 한 수단 이다. 이 부분 은 더욱 깊이 있 는 기술 과 활용 방식 도 연구 할 필요 가 있다. 예 를 들 어 다 중 무늬, 다 중 무늬, 재질 효과 합병, BUMP - MAPPING, 환경 스티커 등 이다.

좋은 웹페이지 즐겨찾기