19
1 Opengl 3

Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

1

Opengl 3

Page 2: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

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);

Page 3: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

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);

Page 4: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

Spot Light

•Spot Light 효과를 적용해보고 그 결과를

확인한다.

Page 5: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

Multiple Light

•Ambient, diffuse, specular 설정

Page 6: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

Point Light

•Point Light 효과를 위해 다음과 같이

설정한다.

Page 7: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

물체의 표면특성 정의

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);

Page 8: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

예제 8.2: 물체의 표면특성 정의

Page 9: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

물체의 표면특성 정의

Page 10: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

물체의 표면특성 정의

•다음과 같은 코드를 추가

-사면체를 이용하여 구를 생성하는 코드이다.

-보다 정확한 구를 생성하기 위해서는 n 값을

증가시킨다.

Page 11: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

물체의 표면특성 정의

•재귀적으로 구를 생성한다.

- Shading을 이해하려면 법선과 외적에 대한

지식이 필요하다.

Page 12: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

물체의 표면특성 정의

•Normal을 계산하는 루틴을 작성한다.

•Cross product를 계산하는 루틴을

작성한다.

Page 13: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

물체의 표면특성 정의

•Flat shading을 위한 루틴을 작성하고

결과를 확인한다.

Page 14: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

물체의 표면특성 정의

•Smooth shading을 위해 기존 코드를

다음과 같이 수정한다.

Page 15: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

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();

Page 16: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

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++;

}

Page 17: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

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);

Page 18: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

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);

Page 19: Opengl 3 - khu.ac.krcvlab.khu.ac.kr/gl12.pdf · 2018. 4. 30. · Light Source 정의 •Shading calculations are enabled by - glEnable(GL_LIGHTING) •Must enable each light source

Texture Mapping