GPU Based Graphics 는 그래픽 처리를 GPU(Graphics Processing Unit)에서 수행하는 방식으로, 현대의 그래픽스 프로그래밍에서 가장 일반적으로 사용되는 접근 방식이다.
#include <vgl.h>
#include <math.h>
#include <InitShader.h>
struct vec2 {
float x, y;
};
const int NUM_POINTS = 5000;
// 모델을 만들면 memory에 저장되며 이를 GPU에 보낼때 Buffer(VBOs)로 보낸다.
// 모델은 Array(VAOs)라고 부르며 VAOs는 VBOs로 이루어짐.
// 프로그램 내 메모리 접근은 포인터(pointer)로 함
// 그러나 프로그램 밖 메모리 (운영체제가 관리하는 메모리)에 접근할 때는 운영체제가 handle을 줌.
// handle은 일종의 권한으로 handle을 받은 메모리의 변경할 수 있는 일종의 권한을 받고 사용함.
void init() {
// 1. Generate Data in CPU
vec2 points[5000];
for (int i = 0; i < NUM_POINTS; i++) {
points[i].x = (rand() % 1000) / 500.0f - 1;
points[i].y = (rand() % 1000) / 500.0f - 1;
}
// 2. Send Data(Array) to GPU
// 2.1. Create a Vertex Array and bind the array
GLuint vao; // OpenGL unsigned int
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// 2.2. Create a Vertex Buffer and bind the buffer
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
// 2.3. copy my data to the buffer
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
// 3. Load Shaders
GLuint program;
program = InitShader("vshader.glsl", "fshader.glsl"); // Handle을 리턴함
glUseProgram(program);
// 4. Connect Data with Shader
GLuint vPosition = glGetAttribLocation(program, "vPosition");
glEnableVertexAttribArray(vPosition);
glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_POINTS, 0, NUM_POINTS);
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutInitWindowSize(800, 800);
glutCreateWindow("Hello GL");
// GPU based Graphics 를 사용하기 위해 추가.
glewExperimental = true;
glewInit();
// CPU 에서 vertex data를 생성하고 GPU에 전달함.
init();
// GPU에 전달된 vertex data를 그림.
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
#version 330
in vec4 vPosition;
out vec4 pos;
void main() {
gl_Position = vPosition;
gl_Position.x = vPosition.x / 2;
gl_Position.y = vPosition.y / 2;
pos = vPosition;
}
#version 330
in vec4 pos;
out vec4 fColor;
void main() {
float r = sqrt(pos.x * pos.x + pos.y * pos.y);
// R G B A(투명도)
fColor = vec4(r, r, r, 1.0);
}
GPU based Graphics 에서 CPU는 vertex data를 생성하고 이를 GPU의 메모리(보통 Array 라고 부름)에 전달한다. GPU 에서는 전달 받은 모델(vertex data) 에 대해 vshader.glsl 과 fshader.glsl 을 실행한다.
vshader.glsl 과 fshader.glsl 은 각각 shader program이라 부르며, 각각 gl_Position과 fColor 값에 대한 작업을 수행한다.
자세한 설명은 다음 장 을 보자.