전체 글(58)
-
shading 표현
shader는 vertex shader와 pixel shader(hlsl기준)이 있습니다. vertex shader는 직접 vertex들을 받아와서 좌표계 변환을 통해 실제 우리가 보는 화면은 어떻게 보이는지 좌표를 나타내고 rasterization을 통해 필요한 픽셀을 계산하고 pixel shader로 넘겨주어서 색을 칠해주게 됩니다. vertex에서는 rotation, scaling, translation의 과정을 거치고 원근 표현을 거치고, world좌표계로 바꾼 뒤 raster(2차원)좌표계로 변하게 됩니다. vertex shader에서 vertex 값들을 가져오고 rotation을 위해 픽셀과, 변하는 각도를 넣어주고 행렬과 곱 translation을 위해 vertex.x + translatio..
2023.05.06 -
backface culling, 원근법
backface culling은 물체의 뒷면은 그리지 않는 것을 말한다. culling을 해줌으로써 보이지 않는 뒷면은 계산하지 않아서 효율적인 컴퓨팅 관리가 가능해진다. 물체가 뒷면인지 앞면인지는 어떻게 확인할지 고민해보면 물체가 앞면이면 normal vector가 양수가 나온다. 뒷면일 경우 음수가 나오게 될 것이다. 그러므로 양수인 것만 색으로 표현해주고 음수인 것은 넘겨버리면 될 것이다. normal이 양수인 경우에는 아래의 판단을 통해 그려준다. 모든 물체는 삼각형으로 이루어져 있다. 모든 정점 세개씩 돌면서 픽셀들 별로 해당 픽셀이 삼각형의 안에 있는지 판단한다. 안에 있는지 판단은 cross product를 통해 한다. 픽셀을 다 돌면서 해당 삼각형 안에 픽셀이 있는지 판단한다. DX는 왼손..
2023.05.03 -
조명 셰이더
조명은 난반사, 정반사를 이용하여 표현할 수 있다. 난반사는 diffuse 이다. 각 vertex별로 normal vector와 해당 vertex와 light 사이의 방향 vector 를 구해서 내적을 통해 diffuse를 구한다. 정반사는 specular로 view vector는 다른 말로 카메라 vector로 볼 수 있다. view vector와 reflection vector의 내적으로 specular 를 구할 수 있다. 이러한 빛의 계산은 어느 과정에서 하는 것이 좋을까 생각해보면 vertex, fragment 둘 중 하나일텐데 vertex에서 계산하면 결과 값들을 fragment로 보내서 fragment 결과로 ambient, diffuse, specular를 더한 색을 return하게 될 것이..
2023.04.30 -
텍스쳐매핑
3D 물체를 이루는 구성요소는 삼각형이다. 이 삼각형에 fragment shader로 색을 표현할수도 있지만 텍스쳐를 이용하여 더욱 쉽게 삼각형을 표현할 수 있게 된다. 이것은 바나나의 텍스쳐이다. object의 위치에 텍스쳐를 mapping 해주면서 넣어주게 된다. 텍스쳐는 기본적으로 tiling을 이용하는데 (0, 0) ~ (1,1)까지 값은 전체 텍스쳐 하나를 나타낸다. 그런데 이 값을 조절해주면 텍스쳐가 해당 값에 따라 반복되게 된다. 저번의 input을 받아온 것처럼 texture도 받아와야한다. struct VS_INPUT { float4 mPosition : POSITION; float2 mTexCoord : TEXCOORD0; }; TEXCOORD0 이 받아서 mTexCoord에 저장하게 ..
2023.04.29 -
HLSL 원 그리기
hlsl은 directX 의 shader언어로 c언어와 비슷한 언어이다. shader는 여러 색조, 명암, 농담 등을 고려해서 최종 색을 표현하는 프로그램이다. 쉐이더는 파이프라인에서 vertex 위치에 대한 정보가 들어가게 되는데 그걸 처리해주는 것이 vertex shader이다. 처음 들어가는 위치에 대한 정보는 3D 상에서의 위치정보이고 해당 데이터가 우리 화면에서 어떻게 보일지 생각하면서 표현해주게 된다. 그리고 처리된 표현을 가지고 Rasterization 이라는 과정을 거쳐서 몇 개의 픽셀이 만들어지는지 결정하게 된다. rasterization에서는 위치에 따른 색 결정(interpolation), 뒷면을 그리지 않는 (back face culling) 등의 여러 작업들을 처리한다. 그리고 마..
2023.04.29 -
깊이 버퍼(depth buffer)
깊이 버퍼는 사물의 앞 뒤를 판단하기 위해 이용하는 버퍼이다. 사물이 먼 순서대로 그리게 되면 상관이 없지만 순서대로 그리지 않지만 거리가 서로 다르다면 현실 세계를 제대로 반영하기가 어려워진다. 그래서 z 버퍼들을 가지고 사물이 어디가 앞이고 뒤인지 확인하는 것이다. 카메라는 z 축 정면을 보기 때문에 깊이 버퍼를 z축으로 한 것 같다. z축을 기준으로 카메라의 위치와 물체의 위치를 픽셀 단위로 계산하면서 각 픽셀의 거리 최솟값에서만 색을 넣어주어서 저장하면 가장 가까운 거리에만 색이 입혀지게 되면서 앞 뒤가 구분되게 된다. z버퍼는 모든 픽셀에 대하여 초기화가 되고 그려질 물체에만 색이 입혀지게 된다. 삼각형 그리기 const vec3 trianglePoint1; const vec3 triangleP..
2023.04.01