[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.glslfragmentShader.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 그래픽 애플리케이션을 개발할 수 있습니다.

참고 자료