no image
텍스처링
원리정교한 모델링을 만든뒤 이미지를 덧씌우는 방식을 사용기존 사각형을 그렸을 때 3개의 점을 이어 삼각형을 만들고, 이렇게 만들어진 삼각형 두개를 이어 사각형을 만들었다사각형에 색상을 입힐 때는 각 꼭짓점에 색상을 넣어주고, 무게중심 좌표계와 보간을 사용하여 물체 안에 색상을 입히는 것도 실습했었다이미지는 이와 비슷한 방법을 사용하지만 꼭짓점마다 색상이 있어 보간을 통해 색상을 정하는 것이 아닌 텍스처 좌표계를 통해 텍스터의 어느 위치에서 색상을 가져올지 판단하여 물체에 입혀준다텍스터 좌표계는 좌측 상단이 원점으로 uv 좌표계를 만들어 사용한다텍스처 좌표계는 이미지의 해상도와 상관없이 uv모두 0~1 사이의 값을 가진다하지만 가로세로의 비가 1:1로 맞지 않는 이미지를 가져오면 이미지가 살짝 찌그러질 수..
2025.05.28
no image
무게중심 좌표계(Barycentric coordinates)
Interpolation(보간)무게중심 좌표계를 이용해 삼각형의 색을 나타나게 하기 위해서 보간을 이용할 것이다예를들어 위의 그림처럼 V0, V1이 있다할 때 그 사이의 어느 지점 V를 구한다해보자V와 V0사이는 a, V와 V1 사이는 b라 할때 V와 V0 사이는 b의 크기의 영향을 받고, V와 V1사이는 a의 크기의 영향을 받는다이를 수식으로나타내면 $ V = \frac{b}{a+b}V_0 + \frac{a}{a+b}V_1$이다이때 $\frac{b}{a+b} + \frac{a}{a+b} = 1$이므로 $V = wV_0 + (1-w)V_1$이 된다삼각형에 적용아래 그림처럼 $\vec{p}$가 삼각형 안에있따 해보자이때 $\vec{p}$가 삼각형의 무게중심이라면 $\vec{p} = \frac{\vec{v_..
2025.05.27
no image
그림자
그림자 그리기레이트레이싱을 통해 Ray가 물체와 충돌하면 그 뒤에 지점에 그림자를 그려주는 방식을 이용할것임하지만 리얼타임 렌더링에서는 이를 활용하는 것이 아닌 그림자를 따로 만들어 붙여주는 방식을 활용함실제 그림자는 광원으로부터 빛이 나와 물체가 부딛히면 그 반대방향으로 생긴다이를 알아차리기 위해 레이트레이싱에서는 충돌 지점에서 광원쪽으로 갈 수 있는지를 판단할 Shadow Ray를 쏴서 광원에 도달하지 못하면 그 부분을 검은색 엠비언트 컬러만 적용시켜 주면 된다광원에 도달한다면 앞에서 했던대로 그 지점에 쉐이딩을 해준다Shadow Ray를 쏠때 쏘는 지점에 따라 쏘는 물체와 충돌을 할수도 있기 때문에 살짝 띄어서 Ray를 발사해야한다실습vec3 traceRay(Ray &ray){ // Render f..
2025.05.26
no image
삼각형과 광선 충돌
레이트레이싱으로 평면상 삼각형 그리기평면에 Vertex가 3개 있고, 그 정점을 연결한 삼각형이 있다할 때, Ray를 평면에 쐈을 때 삼각형에 Ray가 충돌을 했는지, 충돌을 하지 않았는지 판단해야한다판단한 후 조명등에 여러 요인을 가지고 색을 결정하여 눈(카메라)로 보여지면 평면에서 삼각형이 나타나게 될 것이다저번 실습에서 구나 원을 그리듯 Object라는 클래스를 상속받아 만들었기 때문에 CheckRayCollision()을 통해 충돌했는지 안했는지 판단하면 된다CheckRayCollision ()을 통해 충돌을 리턴하기 위해선 IntersectRayTriangle()에서 삼각형이 놓여있는 평면과 광선의 교점을 찾고, 그 교점이 삼각형 안에 있는지 밖에 있는지를 판단해야 한다벡터의 복습내적: $\v..
2025.05.26
no image
원근 투영과 거리 비교
Orthographic projection (정투영) 원근감이 없고 모든 물체가 동일한 크기로 보이는 투영 방법그렇기 때문에 레이트레이싱을 할때 Ray는 모두 다른 지점에서 시작되지만 같은 방향으로 나아가 평행을 유한다즉 아래 코드에서 보이듯이 Ray picelRay의 Direction이 rayDir로 고정이 된다 void Render(std::vector& pixels) { std::fill(pixels.begin(), pixels.end(), vec4{ 0.0f, 0.0f, 0.0f, 1.0f }); const vec3 eyePos(0.0f, 0.0f, -1.5f);#pragma omp parallel for for (int j = 0; j 결과위 그림에서 보듯이 모든 원이 같은 크기로..
2025.05.24
no image
조명효과
Light백색광class Light{public: glm::vec3 pos; // 아주 단순화된 형태의 위치만 있는 점 조명};조명은 다양한 효과를 줄 수 있는데 이번 실습에서는 백색광만을 이용할 것이다물체의 재질PongModle이란?조명이 빛을 반사해 우리 눈에 어떻게 보이는지에 대한 모델Ambient + Diffuse + Specular를 사용해 Phongn Reflection Model을 만들 수 있다 PongShading이란?PongModle을 실제로 구현할 때 이 픽셀 단위의 노멀 벡터를이용해 쉐이딩 하는 것물체의 재질이처럼 Ambient, Diffuse, Specular를 사용해 물체의 재질에 따른 결과값을 다르게 줄 수 있다참고 자료https://en.wikipedia.org/wiki/Pho..
2025.05.24
no image
3차원 구 그리기(구-직선 충돌)
광추적기의 기본 구조pixel에 색 입히기pixel에 색을 입히기 위해선 눈에서부터 화면으로, 화면에서 가상의 물체로 ray를 쏜다고 가정해보자이때 pixel의 z 방향으로 ray가 나간다 했을 때 ray는 물체에 충돌을 하거나 하지 않을것이다충돌을 했다면 충돌 지점에 대한 색을 가져오고, ray를 쏜 pixel을 그 색으로 그려주면 물체의 색으로 물체가 화면에 그려지게 된다raytracing Rendervoid Render(std::vector &pixels){ std::fill(pixels.begin(), pixels.end(), vec4{0.0f, 0.0f, 0.0f, 1.0f});#pragma omp parallel for for (int j = 0; j 모든 pixel에 대해 ray를 그리기 위..
2025.05.23
no image
원 그리기 좌표계 변환
월드 좌표 변환월드 좌표화면의 중앙을 0,0로 하는 좌표계가 있다 가정하자이때 y는 -1~1 사이의 값, x는 aspect ratio로 화면의 비율을 -부터 +까지 하는 좌표계이다이는 오른쪽 위로 올라갈수록 +, 왼쪽 아래로 갈수록 -값을 갖을 것이다스크린 좌표계에서 이 월드 좌표로 변환하여 원을 찍을때 변환을 해야한다Aspect Ratio가로세로의 비율을 나타냄스크린 좌표계와 월드 좌표계 x,y축 비율 맞추기glm::vec2 TransformScreenToWorld(glm::vec2 positionScreen){ float x = 2.0f / (float)(width - 1); float y = 2.0f / (float)(height - 1); return glm::vec2(positionScreen...
2025.05.23
no image
이미지 좌표계를 이용한 원 그리기
이미지 좌표계이미지 좌표계란?화면의 왼쪽 상단을 0,0으로 오른쪽 하단을 width-1, height-1을 기준으로 하는 좌표계이미지가 메모리에 저장되는 순서를 본따서 만든 좌표계스크린 좌표계라고도 함오른쪽 하단으로 갈수록 +방향, 왼쪽 위로 갈수록 - 방향원의 방정식을 이용해 스크린 좌표계에서 원 그리기원의 방정식특정 점이 원의 내부에 있는지 외부에 있는지 구하는 방법은 두 지점의 길이를 구해 반지름과 비교하면 됨반지름보다 작거나 같으면 내부에 존재반지름보다 크면 외부에 존재이를 활용해 코드로 옮기면 아래처럼 된다bool IsInside(const glm::vec2 &x){ if (glm::length(center - x) 결과최적화sqrt 연산은 상당히 느리므로 연산하려는 값의 제곱을 사용하여 연산하..
2025.05.22