[c++] GLEW 라이브러리와 라이팅 효과

GLEW는 OpenGL 확장 함수를 로드하고 관리하기 위한 라이브러리로, OpenGL이 제공하는 최신 확장 기능을 사용할 수 있도록 도와줍니다.

GLEW 라이브러리 적용하기

먼저, GLEW 라이브러리를 프로젝트에 추가해야 합니다. 프로젝트 설정에 맞는 GLEW 라이브러리 파일을 다운로드하고 사용하려는 IDE에서 라이브러리를 추가합니다.

#include <GL/glew.h>

그 다음에는 OpenGL 컨텍스트를 초기화한 이후 GLEW를 초기화해야 합니다.

glewInit();

라이팅 효과 적용하기

OpenGL을 사용하여 기본적인 라이팅 효과를 적용하는 방법은 다음과 같습니다.

  1. 버텍스 셰이더(VERTEX SHADER) 작성
    버텍스 셰이더는 버텍스의 위치 및 속성을 변환하는 역할을 합니다. 라이팅 계산을 위한 버텍스 셰이더는 각 버텍스마다 노말 벡터를 계산하는 역할을 수행합니다.

    #version 330 core
    
    layout (location = 0) in vec3 position;
    layout (location = 1) in vec3 normal;
    
    out vec3 FragPos;
    out vec3 Normal;
    
    uniform mat4 model;
    uniform mat4 view;
    uniform mat4 projection;
    
    void main()
    {
        FragPos = vec3(model * vec4(position, 1.0));
        Normal = mat3(transpose(inverse(model))) * normal;  
        gl_Position = projection * view * model * vec4(position, 1.0);
    }
    
  2. 프래그먼트 셰이더(FRAGMENT SHADER) 작성
    프래그먼트 셰이더는 픽셀의 컬러 값을 계산하는 역할을 합니다. 라이팅 계산을 위한 프래그먼트 셰이더는 각 픽셀의 라이팅 값을 계산합니다.

    #version 330 core
    
    out vec4 FragColor;
    
    in vec3 FragPos;  
    in vec3 Normal;  
    
    uniform vec3 lightPos;
    uniform vec3 viewPos;
    
    void main()
    {
        // 광선과 표면의 노말 벡터 사이의 각도 계산
        vec3 norm = normalize(Normal);
        vec3 lightDir = normalize(lightPos - FragPos);
        float diff = max(dot(norm, lightDir), 0.0);
    
        vec3 diffuse = vec3(1.0, 1.0, 1.0); // 물체의 색상
        FragColor = vec4(diffuse * diff, 1.0); // 라이팅을 반영한 최종 색상값
    }
    
  3. 라이팅 적용
    버텍스 및 프래그먼트 셰이더에서 계산된 라이팅 값을 적용하여 라이팅 효과를 렌더링합니다.

    // ... 렌더링 코드
    glUniform3f(glGetUniformLocation(shader.ID, "lightPos"), lightPos.x, lightPos.y, lightPos.z);
    glUniform3f(glGetUniformLocation(shader.ID, "viewPos"), viewPos.x, viewPos.y, viewPos.z);
    

결론

GLEW 라이브러리를 사용하여 OpenGL의 확장 기능을 쉽게 활용할 수 있으며, 버텍스 셰이더와 프래그먼트 셰이더를 사용하여 기본적인 라이팅 효과를 구현할 수 있습니다.