[c++] GLEW 라이브러리와 라이팅 효과
GLEW는 OpenGL 확장 함수를 로드하고 관리하기 위한 라이브러리로, OpenGL이 제공하는 최신 확장 기능을 사용할 수 있도록 도와줍니다.
GLEW 라이브러리 적용하기
먼저, GLEW 라이브러리를 프로젝트에 추가해야 합니다. 프로젝트 설정에 맞는 GLEW 라이브러리 파일을 다운로드하고 사용하려는 IDE에서 라이브러리를 추가합니다.
#include <GL/glew.h>
그 다음에는 OpenGL 컨텍스트를 초기화한 이후 GLEW를 초기화해야 합니다.
glewInit();
라이팅 효과 적용하기
OpenGL을 사용하여 기본적인 라이팅 효과를 적용하는 방법은 다음과 같습니다.
-
버텍스 셰이더(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); }
-
프래그먼트 셰이더(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); // 라이팅을 반영한 최종 색상값 }
-
라이팅 적용
버텍스 및 프래그먼트 셰이더에서 계산된 라이팅 값을 적용하여 라이팅 효과를 렌더링합니다.// ... 렌더링 코드 glUniform3f(glGetUniformLocation(shader.ID, "lightPos"), lightPos.x, lightPos.y, lightPos.z); glUniform3f(glGetUniformLocation(shader.ID, "viewPos"), viewPos.x, viewPos.y, viewPos.z);
결론
GLEW 라이브러리를 사용하여 OpenGL의 확장 기능을 쉽게 활용할 수 있으며, 버텍스 셰이더와 프래그먼트 셰이더를 사용하여 기본적인 라이팅 효과를 구현할 수 있습니다.