[c++] C++에서의 OpenGL 내장 쉐이딩 언어
OpenGL은 3D 그래픽 애플리케이션을 개발하기 위한 강력한 도구이며, 쉐이딩 언어는 3D 그래픽 요소들을 렌더링하는 데 사용됩니다. C++에서 OpenGL을 사용하여 내장 쉐이더 언어를 사용하는 방법에 대해 알아보겠습니다.
1. GLSL 소개
OpenGL Shader Language(GLSL)은 OpenGL에서 사용되는 쉐이딩 언어로, GPU에서 실행됩니다. GLSL은 C 스타일의 구문을 사용하고, 정점 셰이더(Vertex Shader) 및 프래그먼트 셰이더(Fragment Shader)로 구성됩니다.
2. C++에서 GLSL 사용
2.1. 셰이더 파일 작성
GLSL 셰이더를 작성하기 위해 텍스트 파일에 정점 셰이더 및 프래그먼트 셰이더 코드를 작성해야 합니다. 예를 들어, vertexShader.glsl
과 fragmentShader.glsl
파일을 작성할 수 있습니다.
// vertexShader.glsl
#version 330 core
layout (location = 0) in vec3 position;
void main()
{
gl_Position = vec4(position, 1.0);
}
// fragmentShader.glsl
#version 330 core
out vec4 fragColor;
void main()
{
fragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
2.2. 셰이더 로딩 및 컴파일
C++에서는 위의 셰이더 파일들을 로드하고 컴파일해야 합니다. 이를 위해서는 OpenGL 함수를 사용하여 셰이더를 생성하고 컴파일해야 합니다.
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <fstream>
#include <sstream>
GLuint loadShader(GLenum type, const char *path) {
std::string source;
std::ifstream file(path);
std::stringstream buffer;
buffer << file.rdbuf();
source = buffer.str();
const char *src = source.c_str();
GLuint shader = glCreateShader(type);
glShaderSource(shader, 1, &src, NULL);
glCompileShader(shader);
GLint success;
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
GLchar infoLog[512];
glGetShaderInfoLog(shader, 512, NULL, infoLog);
std::cerr << "Shader compilation failed: " << infoLog << std::endl;
return 0;
}
return shader;
}
2.3. 프로그램에 셰이더 연결
로드하고 컴파일한 후에는 정점 셰이더와 프래그먼트 셰이더를 하나의 프로그램으로 연결해야 합니다.
GLuint vertexShader = loadShader(GL_VERTEX_SHADER, "vertexShader.glsl");
GLuint fragmentShader = loadShader(GL_FRAGMENT_SHADER, "fragmentShader.glsl");
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
결론
C++에서 OpenGL을 사용하여 GLSL 내장 셰이더 언어를 사용하는 방법은 간단합니다. 셰이더 파일을 작성하고, C++에서 로드하고 컴파일한 후 프로그램에 연결하여 GPU에서 실행할 수 있습니다.
이러한 간단한 예제를 바탕으로, 더 복잡한 셰이더 및 OpenGL 기능을 활용하여 다양한 3D 그래픽 애플리케이션을 개발할 수 있습니다.
참고 자료
- OpenGL Shading Language (GLSL) 공식 문서: OpenGL Shading Language