[컴퓨터그래픽스] GPU based Graphics

Serun1017·2024년 10월 23일
0

컴퓨터그래픽스

목록 보기
12/31

GPU based Graphics

GPU Based Graphics 는 그래픽 처리를 GPU(Graphics Processing Unit)에서 수행하는 방식으로, 현대의 그래픽스 프로그래밍에서 가장 일반적으로 사용되는 접근 방식이다.

특징

  • 병렬 처리
    GPU는 수천 개의 작은 코어를 통해 대량의 데이터를 병렬로 처리할 수 있어, 복잡한 계산을 효율적으로 수행한다.
  • 셰이더 프로그램
    사용자는 GLSL 같은 셰이더 언어를 사용하여 GPU에서 실행되는 사용자 정의 그래픽 계산을 작성할 수 있다. 이는 더욱 복잡한 조명, 텍스처 및 효과를 가능하게 한다.
  • 최적화된 성능
    GPU는 그래픽 처리를 위해 최적화되어 있어, 실시간 렌더링 및 고성능 그래픽스 작업을 효율적으로 수행할 수 있다.

실습: RandomDot_GPU

RandomDot_GPU.cpp

#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;
}

vshader.glsl

#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;
}

fshader.glsl

#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 값에 대한 작업을 수행한다.

자세한 설명은 다음 장 을 보자.

0개의 댓글