빨간색 삼각형과 파란색 삼각형이 서로 겹치도록 위치
glm::vec4 vertRed[] = { // will be painted in red
{ -0.2F, -0.2F, 0.0F, 1.0F, },
{ -0.2F, +0.8F, 0.0F, 1.0F, },
{ +0.8F, -0.2F, 0.0F, 1.0F, },
};
glm::vec4 vertBlue[] = { // will be painted in blue
{ +0.2F, +0.2F, 0.0F, 1.0F, },
{ -0.8F, +0.2F, 0.0F, 1.0F, },
{ +0.2F, -0.8F, 0.0F, 1.0F, },
};
#version 330 core
uniform vec4 uColor; // uniform color: uniform
out vec4 FragColor; // fragment color: framebuffer
void main(void) {
FragColor = uColor; // 색상을 받아와 입힘
}
void drawFunc(void) {
...
// draw the red triangle
glVertexAttribPointer(locPos, 4, GL_FLOAT, GL_FALSE, 0, glm::value_ptr(vertRed[0]));
glUniform4f(locColor, 1.0F, 0.3F, 0.3F, 1.0F); // (light) red
glDrawArrays(GL_TRIANGLES, 0, 3);
// draw the blue triangle
glVertexAttribPointer(locPos, 4, GL_FLOAT, GL_FALSE, 0, glm::value_ptr(vertBlue[0]));
glUniform4f(locColor, 0.3F, 0.0F, 1.3F, 1.0F); // (light) blue
glDrawArrays(GL_TRIANGLES, 0, 3);
...
}
void drawFunc(void) {
...
// draw the blue triangle
glVertexAttribPointer(locPos, 4, GL_FLOAT, GL_FALSE, 0, glm::value_ptr(vertBlue[0]));
glUniform4f(locColor, 1.0F, 0.3F, 0.3F, 1.0F); // (light) blue
glDrawArrays(GL_TRIANGLES, 0, 3);
// draw the red triangle
glVertexAttribPointer(locPos, 4, GL_FLOAT, GL_FALSE, 0, glm::value_ptr(vertRed[0]));
glUniform4f(locColor, 0.3F, 0.0F, 1.3F, 1.0F); // (light) red
glDrawArrays(GL_TRIANGLES, 0, 3);
...
}
나중에 그려진 삼각형이 덮어씌움
렌더링 순서에 따라 결과가 달라짐

z-coordinate
[-1.0, +1.0]
카메라에서 멀어질 수록 값이 커짐
OpenGL 정규 뷰 볼륨
x, y, z: [-1, +1] x [-1, +1] x [-1, +1]
Depth 값은 +1로 초기화
object를 그릴 때, 픽셀마다 Depth Test 진행
새로운 object가 더 가까우면, 새로운 object로 color와 depth 값 갱신
더 멀면 무시
OpenGL은 디폴트로 Z-buffer를 사용하지 않음
빨간색 삼각형의 z값은 0.8,
파란색 삼각형의 z값은 0.5로 세팅
glm::vec4 vertRed[] = { // will be painted in red
{ -0.2F, -0.2F, 0.8F, 1.0F, },
{ -0.2F, +0.8F, 0.8F, 1.0F, },
{ +0.8F, -0.2F, 0.8F, 1.0F, },
};
glm::vec4 vertBlue[] = { // will be painted in blue
{ +0.2F, +0.2F, 0.5F, 1.0F, },
{ -0.8F, +0.2F, 0.5F, 1.0F, },
{ +0.2F, -0.8F, 0.5F, 1.0F, },
};
void drawFunc(void) {
// Z-buffer 사용
glEnable(GL_DEPTH_TEST);
glDepthRange(0.0F, 1.0F);
glClearDepthf(1.0F);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
...
// draw the blue triangle
glVertexAttribPointer(locPos, 4, GL_FLOAT, GL_FALSE, 0, glm::value_ptr(vertBlue[0]));
glUniform4f(locColor, 0.3F, 0.0F, 1.3F, 1.0F); // (light) blue
glDrawArrays(GL_TRIANGLES, 0, 3);
// draw the red triangle
glVertexAttribPointer(locPos, 4, GL_FLOAT, GL_FALSE, 0, glm::value_ptr(vertRed[0]));
glUniform4f(locColor, 1.0F, 0.3F, 0.3F, 1.0F); // (light) red
glDrawArrays(GL_TRIANGLES, 0, 3);
...
}
나중에 그려진 빨간색 삼각형이 Depth Test에 의해 파란색 삼각형을 덮어씌우지 않음

좀 더 복잡한 서로 얽힌 사각형
한쪽 면의 z값은 +0.5, 반대쪽 면의 z값은 -0.5
OpenGL의 Rasterizer는 z값도 보간해줌
glm::vec4 vertRed[] = {
{ +0.4F, -0.8F, -0.5F, 1.0F, },
{ +0.6F, -0.8F, -0.5F, 1.0F, },
{ +0.6F, +0.8F, +0.5F, 1.0F, },
{ +0.6F, +0.8F, +0.5F, 1.0F, },
{ +0.4F, +0.8F, +0.5F, 1.0F, },
{ +0.4F, -0.8F, -0.5F, 1.0F, },
};
glm::vec4 vertGreen[] = {
{ +0.8F, +0.4F, -0.5F, 1.0f, },
{ +0.8F, +0.6F, -0.5F, 1.0f, },
{ -0.8F, +0.6F, +0.5F, 1.0f, },
{ -0.8F, +0.6F, +0.5F, 1.0f, },
{ -0.8F, +0.4F, +0.5F, 1.0f, },
{ +0.8F, +0.4F, -0.5F, 1.0f, },
};
glm::vec4 vertBlue[] = {
{ -0.4F, +0.8F, -0.5F, 1.0F, },
{ -0.6F, +0.8F, -0.5F, 1.0F, },
{ -0.6F, -0.8F, +0.5F, 1.0F, },
{ -0.6F, -0.8F, +0.5F, 1.0F, },
{ -0.4F, -0.8F, +0.5F, 1.0F, },
{ -0.4F, +0.8F, -0.5F, 1.0F, },
};
glm::vec4 vertYellow[] = {
{ -0.8F, -0.4F, -0.5F, 1.0f, },
{ -0.8F, -0.6F, -0.5F, 1.0f, },
{ +0.8F, -0.6F, +0.5F, 1.0f, },
{ +0.8F, -0.6F, +0.5F, 1.0f, },
{ +0.8F, -0.4F, +0.5F, 1.0f, },
{ -0.8F, -0.4F, -0.5F, 1.0f, },
};
서로의 Depth가 얽혀 있지만, 픽셀 단위로 Depth Test 하기에 정상적으로 그릴 수 있음
