rasterization 9

[PBR] 텍스춰 노멀매핑

텍스춰링을 할 때 기본적으로 texcoord를 이용해 텍스춰를 Mesh에 붙이는 작업을 하였습니다. 하지만, 좀 더 사실적인 이미지를 표현하기 위해 텍스춰링 시, 텍스춰 자체의 노멀벡터를 이용할 수 있습니다.  노멀벡터는 조명 계산시에 이용이 되는데, 노멀벡터를 실제 사용할 때는 월드 좌표계로 변환이 된 후 사용이 됩니다. 하지만 텍스춰를 불러올 때 텍스춰의 노멀벡터의 값은 텍스춰 좌표계입니다. directX의 텍스춰 좌표는 x축을 오른쪽 y축이 아래를 향합니다. 좌표계 변환 시 다음의 공식을 떠올려봅시다여기서 r(i), r(j), r(k)는 뒤의 T,B,N과 대응이 됩니다. 간단하게 이해를 돕기 위해 다음의 코드를 봅시다. float3 normalTex = g_normalTexture.SampleLev..

그래픽스 기술 2025.01.05

[Staging기법] Gpu텍스춰를 Cpu로 가져오기 (마우스피킹)

Direct3d와 게임 엔진 등 대부분 RayTracing이 아니라, Rasterization방식을 이용합니다. 여기서 물체를 클릭하고 싶을 때, 어떻게 할까요? 방법은 두 가지가 있습니다.1. 월드좌표계의 물체에 eye에서 마우스 위치 방향으로 ray를 쏘기.2. 스크린 좌표계에 투영된 물체를 이용하여 클릭된 물체 찾기 첫번째 방식은 ray를 쏘는 방식입니다. RayTracing방식이나 Rasterization방식이나 많이 이용합니다. 하지만 Gpu 자료를 Cpu로 가져오는 연습을 하기위해 두번째 방식을 공부해봅시다. 두번째 방식을 좀 더 자세히 알아보겠습니다.순서는 다음과 같습니다.1) 각 물체마다 index를 정하고 물체마다 고유 색깔을 지정합니다.2) 렌더 타겟을 두개 준비합니다.    첫번째 렌..

그래픽스 기술 2024.12.23

[렌더링 파이프라인] Subdivision의 개념

렌더링 파이프라인에서 첫 초기화시 몇가지 버퍼를 gpu에 메모리를 저장해야 합니다. 텍스쳐메모리, 각 메쉬의 vertex버퍼, constant버퍼등을 저장합니다. 하지만 초기화 시 mesh의 vertex들의 수가 많다면 시간이 오래 걸리게 됩니다. cpu에서 gpu로 데이터를 보내는데 시간이 오래걸리기 때문입니다. 따라서 gpu에 보내는 데이터의 크기를 줄이면 줄일수록 좋습니다. subdivision의 개념은 어떠한 메쉬를 vertex의 수를 적게 그린 후, 각 삼각형을 4개로 분할하여 다시 그려주는 것입니다. 구를 예를들어 보자면, 다음 구는 vertex의 수를 적게 하고 그린 예시입니다. 하지만 여기서 삼각형을 여러개로 분할하면 어떻게 될까요?다음 그림에서 삼각형을 이렇게 4개로 나눕니다. 새로 생긴..

그래픽스 기술 2024.12.04

[Non-Uniform Scale] Scale변환 시 normal벡터 변환 방법 유도

Rasterization에서 vertex쉐이더 단계에서 삼각형을 변환할 때 Rotation, Translation Scale 행렬 등을 통해 변환합니다.  하지만 반드시 같이 변환해줘야 하는 벡터가 있는데 삼각형의 normal벡터(법선벡터)입니다. Rotation이나 Translation은 변환시 상관이 없는데 Scale변환 시 normal벡터가 변환된 삼각형과 수직이 안 될 수 있기 때문에 따로 다른 행렬을 통해 변환 시켜줘야합니다.  예를들어 다음 그림과 같이 non-uniform형식의 변환이 있다고 생각해봅시다. non-uniform형식은 x, y, z 각각이 같은 비율이 아니라 다른 비율로 변환 된다는 뜻입니다.  (a)에서 (b)로 변환되었고, (c)는 b의 normal벡터를 수직화 한 것입니다..

[Rasterization] 빛의 조명 3가지

그래픽스 렌더링에서 빛의 조명은 다음과 같이 총 3가지로 구분할 수 있습니다.1. Directional Light Directional Light은 태양을 빗대서 만든 방식입니다. 따라서 빛이 어디에서 시작하는지를 구분하지않고, 빛을 맞는 지점마다 빛의 세기에 차이를 두지 않습니다. 즉 Direction(방향)과 빛 자체의 세기만 고려합니다.코드는 다음과 같습니다.vec3 BlinnPhong(vec3 lightStrength, vec3 lightVec, vec3 normal, vec3 toEye, Material mat) { vec3 halfway = normalize(toEye + lightVec); vec3 specular = mat.specular ..

그래픽스 기술 2024.11.11

[Rasterization] Blinn-Phone 모델(블린 퐁 모델)

블린 퐁 모델은 퐁 모델에서 specular계산을 더 간단하게 하는 방식입니다. 퐁 모델에서 specular를 계산하기 위해, 반사된 빛의 방향을 알아야 하는데, 그 계산이 조금 복잡하기 때문입니다. 이유는 이전 글 퐁모델 : https://pdy0930.tistory.com/54을 참고하면 될 것 같습니다.  블린퐁 모델의 개념은 퐁 모델에서 specular만 다르게 생각하면 됩니다. ambient와 diffuse는 퐁 모델과 같기 때문입니다.다음 그림을 보면, 퐁 모델에서는 없는 H벡터가 있습니다. H벡터는 V와 L의 합 벡터를 유닛화 한 벡터입니다. V를 R에 가깝게 갈 수록 H는 N의 각도가 작아집니다. V를 R에서 떨어뜨릴 수록 N과 H사이의 각도가 커집니다. 따라서 N과 H의 내적을 퐁 모델에..

그래픽스 기술 2024.11.05

[Rasterization] 원 그리기와 vertex 2차원 변환

이번에는 Rasterization을 통해 원을 그리고 그 원을 2차원변환(이동, 크기조절, 회전 등)을 조절해볼 것입니다.고등학교 때 배웠던 간단한 수학 공식이 조금 필요한데요. 그 전에 Rasterization에서는 Raytracing과는 원을 그리는 방식이 다르다는 점을 이해해야합니다. Raysterizaion은 삼각형을 레스터좌표계에 투영해서 픽셀에 나타내는데요. 원 또한 수많은 삼각형을 통해 나타냅니다. 다음 그림과 같이 삼각형을 5개 그리면 5각형이 됩니다. 삼각형을 20개 정도 그리면 원에 가까워지겠죠?    여기서 원을 그리는 원리를 알아볼 것입니다.5개의 삼각형을 표현할 때 x,y좌표의 원점을 원의 중심이라고 생각합니다. 그리고 꼭짓점이 원점에서의 삼각형의 각도는 θ 입니다. 따라서 각 꼭..

그래픽스 기술 2024.10.28

[Rasterization] 삼각형의 레스터화

이전 글에서는 Raytracing에 대해서만 공부해봤습니다. 이번엔 Rasterization에 대해 알아볼 건데요. 둘의 차이점은 뭘까요? Ray Tracing은 보다 물리적으로 정확한 빛의 경로를 추적하여 렌더링하는 방식입니다. 영화나 애니메이션과 같은 비실시간 렌더링에서 많이 사용됩니다. Ray를 발사해서 반사, 그림자, 굴절 등을 반영하여 보다 현실적인 이미지를 나타냅니다. 반면, Rasterization은 3D 모델을 2D 화면에 투영하는 전통적인 렌더링 방식입니다. 이 방법은 주로 실시간 렌더링(예: 게임 엔진)에서 사용됩니다. 빛을 발사하는게 아니라 각 삼각형을 화면공간(스크린 좌표계)로 투영하는 방식을 사용하여 이미지를 나타냅니다.  Raytracing은 픽셀마다 ray를 발사해서 모든 물체..

그래픽스 기술 2024.10.24

[그래픽스]벡터의 외적 개념

벡터의 외적(cross product)은 주로 3차원 벡터에서 정의되는 연산으로, 두 벡터로부터 새로운 벡터를 만들어내는 연산입니다. 외적을 통해 얻어진 벡터는 두 벡터가 이루는 평면에 수직한 벡터(법선 벡터)가 됩니다.외적은 물리학과 컴퓨터 그래픽스에서 중요한 역할을 합니다. 특히, 두 벡터로 이루어진 평면에서 수직한 방향을 구할 때, 또는 회전과 관련된 문제를 풀 때 자주 사용됩니다.1. 벡터의 외적 공식A= (Ax,Ay,Az), B= (Bx,By,Bz) 일때A x B = (AyBz - AzBy, AzBx - AxBz, AxBy - AyBx) 이고, 이 벡터는 두 벡터에 모두 수직인 새로운 벡터입니다.2. 외적의 기하학적 의미외적의 결과는 두 벡터가 이루는 평면에 수직인 벡터를 반환합니다. 기하학적으..