※ 본 포스팅은 learnopengl.com을 번역 및 가감한 포스팅이며, learnopengl에서는 번역 작업 참여를 적극 장려하고 있습니다!
아래 링크에서 원문을 확인할 수 있습니다.
Fragment shader
fragment shader는 렌더링의 두 번째 단계이면서 이 이후에는 특별히 shader를 작성하지 않아도 됩니다. fragment shader는 pixel의 색상을 출력하는 계산의 역할을 하는데요. 여기서 우리는 주황색 색상을 출력하도록 합시다.
컴퓨터 그래픽에서 색은 보통 Red, Green, Blue, Alpha(투명도) 4개의 값으로 구성됩니다. 이걸 RGBA라고 합니다. OpenGL이나 GLSL에서는 Color를 0~1 사이의 값으로 설정해서 표현합니다. 만약 빨강 1.0이고 녹색 1.0이면 노란색이 나오죠. 세 색상의 조합으로 1,600만 가지를 표현 가능합니다.
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
fragment shader는 출력 변수가 최종적으로 픽셀의 색을 결정하는 vec4 하나입니다. out 키워드로 선언하고 여기서는 변수명을 FragColor로 했습니다. 이 변수에 주황색 색상과 alpha 1.0(완전 불투명)을 할당했습니다.
fragment shader 컴파일은 vertex shader와 비슷합니다. 다른 점은 shader type이 GL_FRAGMENT_SHADER라는 겁니다.
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
두 shader 모두 컴파일 했으니 이제 shader object들을 렌더링에 사용할 수 있도록 링크해야합니다.
Shader program
shader program object는 여러 shader를 결합해서 연결합니다. 우리가 컴파일한 shader를 사용하기 위해 shader object를 shader program object에 link하고 활성화해야합니다. 그러면 렌더링 때 연결한 shader가 사용됩니다.
link하게 되면 shader의 출력은 다음 shader의 입력으로 연결되므로 입출력 형식이 다르면 link 오류가 생깁니다.
program object를 생성합니다.
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
glCreateProgram으로 program을 생성하고 반환된 ID를 이용해서 프로그램을 사용합니다.
이제 glLinkProgram으로 프로그램에 shader object를 link합니다.
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
shader program도 link에서 오류가 나는지 확인할 수 있습니다. shader 때와 비슷합니다.
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if(!success) { glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); ... }
이렇게 program object를 생성하고 glUseProgram으로 shader program을 사용하도록 설정합니다.
glUseProgram(shaderProgram);
이제 shader program에 담은 shader로 렌더링을 합니다.
여기서 중요한 점은 program object에 shader를 link하고 나서부터는 shader object를 사용하지 않을 것이므로 삭제해야합니다.
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
여기까지 vertex data를 처리하였는데, 다음 포스팅에서 해야 할 남은 역할은 opengl에게 메모리로 전달된 vertex data를 읽는 방법이나 vertex data를 vertex shader attribute와 연결하는 방법 등이 필요합니다.