반응형
Vertex & Geometry & Fragment Shader는 Shader Program으로 Link함으로써 사용할 수 있다.
const char* vShaderCode = vertexCode.c_str();
const char* fShaderCode = fragmentCode.c_str();
const char* gShaderCode = geometryCode.c_str();
// DESC :> Shader Compile
unsigned int vertex;
unsigned int fragment;
unsigned int geometry;
int success;
char infoLog[512];
vertex = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex, 1, &vShaderCode, NULL);
glCompileShader(vertex);
glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertex, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATINO_FAILED\n" << infoLog << std::endl;
}
fragment = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment, 1, &fShaderCode, NULL);
glCompileShader(fragment);
glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertex, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATINO_FAILED\n" << infoLog << std::endl;
}
geometry = glCreateShader(GL_GEOMETRY_SHADER);
glShaderSource(geometry, 1, &gShaderCode, NULL);
glCompileShader(geometry);
glGetShaderiv(geometry, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(geometry, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::GEOMETRY::COMPILATINO_FAILED\n" << infoLog << std::endl;
}
// DESC :> Shader Program Setting
ID = glCreateProgram();
glAttachShader(ID, vertex);
glAttachShader(ID, fragment);
glAttachShader(ID, geometry);
glLinkProgram(ID);
glGetProgramiv(ID, GL_LINK_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertex, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
}
glDeleteShader(vertex);
glDeleteShader(fragment);
glDeleteShader(geometry);
Shader 생성, 초기화 및 컴파일
- glCreateShader() - Parameter에 맞는 Shader를 생성
- glShaderSource() - 생성된 Shader에 맞는 Shader 내용 초기화
- glCompileShader() - 초기화된 Shader를 Compile
- glGetShaderiv() - Shader의 Compile 상태 확인
- glGetShaderInfoLog() - Shader의 Compile 실패 Log 확인
각 각의 Shader를 위의 함수들을 사용하여, 컴파일까지 완료되면 Link 준비가 끝난다.
하나의 Shader라도 Compile이 실패한다면, Link 단계에서도 반드시 에러가 난다.
Shader를 Compile 하는 단계에서는 Syntax 에러가 나는 경우가 대부분이기 때문에, 내용을 꼼꼼히 확인하는 것으로 해결이 가능하다.
Shader Program 생성 및 Link
- glCreateProgram() - Shader Program 생성
- glAttachShader() - Shader Program에 사용할 Shader 등록 (Vertex, Fragment 필수)
- glGetProgramiv() - Shader Program의 Shader Link 상태 확인
반응형
'게임 개발 끄적 > OpenGL' 카테고리의 다른 글
[OpenGL] Shader File (0) | 2020.02.07 |
---|---|
[OpenGL] Shader Rendering (0) | 2019.10.15 |
[OpenGL] 기본 코드 이해 (0) | 2019.10.14 |
[OpenGL] 환경 설정 구축 (0) | 2019.10.14 |