Interpolation, Indexed Draws and Projections

정민용·2025년 7월 16일

Interpolation

  • Rasterization 단계에서 정점 사이의 공간을 채우는 픽셀, 즉 프래그먼트의 속성 값을 계산하는 과정
  • 값을 정의하지 않고 빠르고 정확하게 추정하는데 사용됨.
  • Phong Shading 방식에서 표면을 매끄럽고 둥그렇게 착시현상을 만드는 데 이용됨.

Simple Example

// Vertex Shader
#version 330

layout (location = 0) in vec3 pos;

out vec4 vCol;

uniform mat4 model;

void main()
{
	gl_Position = model * vec4(pos, 1.0f);
    vCol = vec4(clamp(pos, 0.0f, 1.0f), 1.0f);
}
// Fragment Shader
#version 330

in vec4 vCol;

out vec4 Color;

void main()
{
	color = vCol;
}
// main Program
...
GLfloat vertices[] = {
	-1.0f, -1.0f, 0.0f,	// (-1.0, -1.0, 0.0) RGB(0, 0, 0) 검정색
    1.0f, -1.0f, 0.0f,	// (1.0, -1.0, 0.0) RGB(1, 0, 0)  빨간색
    0.0f, 1.0f, 0.0f	// (0.0, 1.0, 0.0) RGB(0, 1, 0)   초록색
};
...

Indexed Draws

  • 정점 데이터를 재사용하여 기하학적 도형을 효율적으로 그리는 기법
  • 중복되는 정점 데이터를 저장할 필요가 없기에 메모리 사용량이 크게 감소됨.
  • GPU에 더 적은 데이터를 전송하기에 렌더링 속도가 향상됨.

일반 드로잉 : 2개의 삼각형을 위해서는 6개의 정점 필요, 이 과정에서 2개의 정점은 중복해서 데이터에 포함됨.
인덱스 드로잉 : 고유한 정점 4개만 정의한 뒤, 어떤 순서로 이 정점들을 연결하여 삼각형을 만들지 인덱스로 알려줌.

Simple Example

void CreateTriangle() {
	unsigned int indices[] = {
		0, 3, 1,
		1, 3, 2,
		2, 3, 0,
		0, 1, 2
	};

	GLfloat vertices[] = {
		-1.0f, -1.0f, 0.0f,
		0.0f, -1.0f, 1.0f,
		1.0f, -1.0f, 0.0f,
		0.0f, 1.0f, 0.0f
	};

	glGenVertexArrays(1, &VAO);	// create VAO
	glBindVertexArray(VAO); // bind VAO

	glGenBuffers(1, &IBO); // create IBO
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO); // bind IBO
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

	glGenBuffers(1, &VBO); // create VBO
	glBindBuffer(GL_ARRAY_BUFFER, VBO); // bind VBO
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // copy vertices to VBO
	
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glEnableVertexAttribArray(0);

	glBindBuffer(GL_ARRAY_BUFFER, 0); // unbind VBO
	glBindVertexArray(0); // unbind VAO

	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // unbind IBO
}

...
glEnable(GL_DEPTH_TEST);	// Enable depth testing for 3D
...

// Clear window
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBindVertexArray(VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);

glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, 0);

glBindVertexArray(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

Projections

  • 3D 공간의 물체를 2D 화면에 어떻게 보여줄지 결정하는 변환 과정

Co-ordinate Systems

  • Local Space : 물체 그 자체의 고유한 좌표계
  • World Space : 씬에 존재하는 모든 물체가 공유하는 하나의 전역 좌표계
    - Local -> World : Model Matrix(이동, 회전, 크기 변환)
  • View Space : 카메라의 시점에서 바라본 공간
    - World -> View : View Matrix(카메라의 위치와 방향의 반대 변환)
  • Clip Space : 카메라의 시야만에 들어오는 것만 남기고, 밖의 것들은 잘라내기 위해 정의된 공간
    - View -> Clip : Projection Matrix(Orthographic / Perspective)
  • Screen Space : 최종적으로 모니터 화면에 표시되는 2D 픽셀 좌표계

Projections - Orthographic

  • 직교 투영 : 물체와 카메라 사이의 거리를 무시하기에 모든 물체는 원래의 상대적인 크기를 그대로 유지함.

Projections - Perspective

  • 원근 투영 : 멀리 있는 물체는 작게 보이고, 가까이 있는 물체는 크게 보임.
  • fov(field-of-view) : 시야각
    - 각도가 클수록 넓은 영역을 볼 수 있으나 왜곡이 심해짐
  • aspect : 화면의 가로세로 비율
  • near : 가까운 클리핑 평면
    - 이 평면보다 가까운 물체는 렌더링되지 않음.
  • far : 먼 클리핑 평면
    - 이 평면보다 먼 물체는 렌더링되지 않음.
gl_Position = projection * view * model * aPos;

Simple Example

// Vertex Shader
#version 330

layout (location = 0) in vec3 pos;

out vec4 vCol;

uniform mat4 model;
uniform mat4 projection;

void main()
{
	gl_Position = projection * model * vec4(pos, 1.0f);
    vCol = vec4(clamp(pos, 0.0f, 1.0f), 1.0f);
}
// main Program
GLuint uniformProjection = glGetUniformLocation(shader, "projection");

glm::mat4 projection = glm::perspective(45.0f, (GLfloat)bufferWidth / (GLfloat)bufferHeight, 0.1f, 100.0f);

glUniformMatrix4fv(uniformProjection, 1, GL_FALSE, glm::value_ptr(projection));

0개의 댓글