소스코드
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>
#include <fstream>
#include <string>
GLuint VBO, VAO, shader;
std::string ReadFile(const char* filePath)
{
std::string content;
std::ifstream fileStream(filePath, std::ios::in);
while (!fileStream.is_open())
{
printf("Failed to read %s file! The file doesn't exist.\n", filePath);
return "";
}
std::string line = "";
while (!fileStream.eof())
{
std::getline(fileStream, line);
content.append(line + "\n");
}
fileStream.close();
return content;
}
GLuint AddShader(const char* shaderCode, GLenum shaderType)
{
GLuint new_shader = glCreateShader(shaderType);
const GLchar* code[1];
code[0] = shaderCode;
glShaderSource(new_shader, 1, code, NULL);
GLint result = 0;
GLchar err_log[1024] = { 0 };
glCompileShader(new_shader);
glGetShaderiv(new_shader, GL_COMPILE_STATUS, &result);
if (!result)
{
glGetShaderInfoLog(new_shader, sizeof(err_log), NULL, err_log);
printf("Error compiling the %d shader: '%s'\n", shaderType, err_log);
return 0;
}
return new_shader;
}
void CompileShader(const char* vsCode, const char* fsCode)
{
GLuint vs, fs;
shader = glCreateProgram();
if (!shader)
{
printf("Error: Cannot create shader program.");
return;
}
vs = AddShader(vsCode, GL_VERTEX_SHADER);
fs = AddShader(fsCode, GL_FRAGMENT_SHADER);
glAttachShader(shader, vs); // Attach shaders to the program for linking process.
glAttachShader(shader, fs);
GLint result = 0;
GLchar err_log[1024] = { 0 };
glLinkProgram(shader); // Create executables from shader codes to run on corresponding processors.
glGetProgramiv(shader, GL_LINK_STATUS, &result);
if (!result)
{
glGetProgramInfoLog(shader, sizeof(err_log), NULL, err_log);
printf("Error linking program: '%s'\n", err_log);
return;
}
}
void CreateShaderProgramFromFiles(const char* vsPath, const char* fsPath)
{
std::string vsFile = ReadFile(vsPath);
std::string fsFile = ReadFile(fsPath);
const char* vsCode = vsFile.c_str();
const char* fsCode = fsFile.c_str();
CompileShader(vsCode, fsCode);
}
void CreateTriangle()
{
GLfloat vertices[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f
};
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
int main(void)
{
if (!glfwInit())
exit(EXIT_FAILURE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
GLFWwindow* window = glfwCreateWindow(1080, 720, "title", NULL, NULL);
if (!window)
{
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
int framebuf_width, framebuf_height;
glfwGetFramebufferSize(window, &framebuf_width, &framebuf_height);
glViewport(0, 0, framebuf_width, framebuf_height);
if (glewInit() != GLEW_OK)
{
glfwTerminate();
exit(EXIT_FAILURE);
}
CreateTriangle();
CreateShaderProgramFromFiles("Shaders/shader.vert", "Shaders/shader.frag");
while (!glfwWindowShouldClose(window))
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shader);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glUseProgram(0);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
Vertex shader
#version 460
layout (location = 0) in vec3 pos;
void main()
{
gl_Position = vec4(pos, 1.0);
}
#version GLSL버전
0번째 vetex attribute를 가져와 vec3 pos 변수에 넣음
gl_position은 미리 정의된 vertex shader의 출력값으로 clip-space에서의 vertex 좌표
Fragment shader
#version 460
out vec4 color;
void main()
{
color = vec4(0.0, 1.0, 0.0, 1.0);
}
#version GLSL버전
출력 변수로 vec4 color 선언, 내장 변수가 아니므로 변수명은 마음대로
관습적으로 vetex shader의 파일명은 xxxx.vert로 fragment shader의 파일명은 xxxx.frag로 함
'DirectX | OpenGL' 카테고리의 다른 글
[OpenGL] 기초 3. 삼각형 만들기 (0) | 2021.12.02 |
---|---|
[OpenGL] 기초 2. GLFW로 window 띄우기 (0) | 2021.12.02 |
[OpenGL] 기초 1. Visual Studio 2019에서 OpenGL, GLFW, GLES 사용하기 (0) | 2021.12.02 |