1
Opengl 3
Light Source 정의
• Shading calculations are enabled by
- glEnable(GL_LIGHTING)
• Must enable each light source individually
- glEnable(GL_LIGHTi) i=0,1…..
• Can choose light model parameters
- GL_FRONT, GL_BACK, GL_FRONT_AND_BACK
• Set the parameters for the light sourcegl
- glLightv(GL_LIGHT0, GL_POSITION, light0_pos);
- 광원 위치:GL_POSITION,
- Light source 종류: GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR,
• 예:glLightv(GL_LIGHT0, GL_AMBIENT, ambient0);
Light Source 정의
gluLookAt(0, 2.0, 2.0, 0, 0, 0, 0, 1.0, 0);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLfloat diffuse0[4] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat ambient0[4] = { 0.1, 0.1, 0.1, 1.0 };
GLfloat specular0[4] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light0_pos[4] = { 2.0, 2.0, 2.0, 1.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular0);
Spot Light
•Spot Light 효과를 적용해보고 그 결과를
확인한다.
Multiple Light
•Ambient, diffuse, specular 설정
Point Light
•Point Light 효과를 위해 다음과 같이
설정한다.
물체의 표면특성 정의
GLfloat mat_ambient[4] = { 0.3f, 0.0f, 0.0f, 1.0f };
GLfloat mat_diffuse[4] = { 0.6f, 0.0f, 0.0f, 1.0f };
GLfloat mat_specular[4] = { 0.8f, 0.6f, 0.6f, 1.0f };
GLfloat mat_shininess = 32.0;
// 폴리곤의 앞면의 재질을 설정
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);
glutSolidTeapot(1.0);
예제 8.2: 물체의 표면특성 정의
물체의 표면특성 정의
물체의 표면특성 정의
•다음과 같은 코드를 추가
-사면체를 이용하여 구를 생성하는 코드이다.
-보다 정확한 구를 생성하기 위해서는 n 값을
증가시킨다.
물체의 표면특성 정의
•재귀적으로 구를 생성한다.
- Shading을 이해하려면 법선과 외적에 대한
지식이 필요하다.
물체의 표면특성 정의
•Normal을 계산하는 루틴을 작성한다.
•Cross product를 계산하는 루틴을
작성한다.
물체의 표면특성 정의
•Flat shading을 위한 루틴을 작성하고
결과를 확인한다.
물체의 표면특성 정의
•Smooth shading을 위해 기존 코드를
다음과 같이 수정한다.
Texture Mapping glBegin(GL_QUADS);
glColor3f(0.4, 0.4, 0.4);
glVertex3f(-0.2, -0.2, -0.2);
glColor3f(0.4, 0.4, 0.4);
glVertex3f(-0.2, 0.2, -0.2);
glColor3f(0.4, 0.4, 0.4);
glVertex3f(0.2, 0.2, -0.2);
glColor3f(0.4, 0.4, 0.4);
glVertex3f(0.2, -0.2, -0.2);
glColor3f(0.4, 0.4, 0.4);
glVertex3f(-0.2, -0.2, 0.2);
glColor3f(0.4, 0.4, 0.4);
glVertex3f(-0.2, 0.2, 0.2);
……
glEnd();
Texture Mapping FILE* f = fopen("mymap.bmp", "rb");
unsigned char info[54];
fread(info, sizeof(unsigned char), 54, f); // read the 54-byte header
// extract image height and width from header
int width = *(int*)&info[18];
int height = *(int*)&info[22];
int size = 3 * width * height;
unsigned char* data = new unsigned char[size];
fread(data, sizeof(unsigned char), size, f);
fclose(f);
for (i = 0; i < width; i ++)
for (j = 0; j < height; j ++)
{
mytexels[j][i][0] = data[k * 3 + 2];
mytexels[j][i][1] = data[k * 3 + 1];
mytexels[j][i][2] = data[k * 3];
k++;
}
Texture Mapping
GLubyte mytexels[512][512][3];
glTexImage2D(GL_TEXTURE_2D, 0, 3, 512, 512, 0, GL_RGB,
GL_UNSIGNED_BYTE, mytexels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
Texture Mapping
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2d(0.0, 0.0);
glVertex3f(-0.2, -0.2, -0.2);
glTexCoord2d(1.0, 0.0);
glVertex3f(-0.2, 0.2, -0.2);
glTexCoord2d(1.0, 1.0);
glVertex3f(0.2, 0.2, -0.2);
glTexCoord2d(0.0, 1.0);
glVertex3f(0.2, -0.2, -0.2);
glTexCoord2d(0.0, 0.0);
glVertex3f(-0.2, -0.2, 0.2);
glTexCoord2d(1.0, 0.0);
Texture Mapping