전체 글
-
화면에 보이는 부분만 그리면 성능적인 이득을 볼 수 있다. 이것을 backface culling이라고 한다. 비슷하게 occlusion(다른 물체에 가리는 것)을 그리지 않는 culling 방식도 있다. 화면에 projection된 vertex의 위치가 시계방향(왼손좌표계 기준)이면 앞면, 반시계 방향이면 뒷면이라고 판단한다. 그렇다면 애초에 vertex를 저렇게 시계방향으로 잘 순서대로 잘 배치해주는 건 어떻게 작동되는거냐? -> 그건 모델링 소프트웨어에서 지원한다. vertex를 화면으로 projection vertex들의 좌표가 screen 좌표계로 변환된다. 월드 좌표계에서는 z방향이 화면 안으로 들어가는 방향이었다. 반대로 screen 좌표계에서는 우리쪽으로 오는 방향이다. 이때 삼각형이 앞면인..
뒷면 제거 (backface culling)화면에 보이는 부분만 그리면 성능적인 이득을 볼 수 있다. 이것을 backface culling이라고 한다. 비슷하게 occlusion(다른 물체에 가리는 것)을 그리지 않는 culling 방식도 있다. 화면에 projection된 vertex의 위치가 시계방향(왼손좌표계 기준)이면 앞면, 반시계 방향이면 뒷면이라고 판단한다. 그렇다면 애초에 vertex를 저렇게 시계방향으로 잘 순서대로 잘 배치해주는 건 어떻게 작동되는거냐? -> 그건 모델링 소프트웨어에서 지원한다. vertex를 화면으로 projection vertex들의 좌표가 screen 좌표계로 변환된다. 월드 좌표계에서는 z방향이 화면 안으로 들어가는 방향이었다. 반대로 screen 좌표계에서는 우리쪽으로 오는 방향이다. 이때 삼각형이 앞면인..
2023.11.10 -
DirectX 의 동작 단계(그래픽스 파이프 라인)를 보면... 쉐이더라는 용어가 계속 등장하는 것을 볼 수 있다. 각 스테이지를 부분적으로 모듈처럼 떼서 각각 구현하고 붙이고 할 수 있다. (튜닝이 쉽다) 각 스테이지와 스테이지 사이의 화살표 부분의 디테일한 구현은 실제로는 감추어져 있다. 일단 당분간 집중할 쉐이더는 Vertex Shader, Pixel Shader이다 vertex 쉐이더란 무엇인가? 하나의 프로그램이라고 생각하면 된다. 물체를 이동, 크기 변환, 회전 등을 한다. (물체에 해당하는 vertex 모두에 똑같이 적용됨) 어떠한 정보가 들어오고 어떠한 정보가 나가는가? 를 보면 된다. 예) position, color, uv가 들어오고 나가는 vertex 쉐이더. pixel 쉐이더(fra..
쉐이더 개념DirectX 의 동작 단계(그래픽스 파이프 라인)를 보면... 쉐이더라는 용어가 계속 등장하는 것을 볼 수 있다. 각 스테이지를 부분적으로 모듈처럼 떼서 각각 구현하고 붙이고 할 수 있다. (튜닝이 쉽다) 각 스테이지와 스테이지 사이의 화살표 부분의 디테일한 구현은 실제로는 감추어져 있다. 일단 당분간 집중할 쉐이더는 Vertex Shader, Pixel Shader이다 vertex 쉐이더란 무엇인가? 하나의 프로그램이라고 생각하면 된다. 물체를 이동, 크기 변환, 회전 등을 한다. (물체에 해당하는 vertex 모두에 똑같이 적용됨) 어떠한 정보가 들어오고 어떠한 정보가 나가는가? 를 보면 된다. 예) position, color, uv가 들어오고 나가는 vertex 쉐이더. pixel 쉐이더(fra..
2023.11.08 -
여러 물체가 겹쳐 있을때 뭘 위에 그릴까? depth buffer 라는 것을 만들어서 depth가 얕은것만 그리면 된다. https://knowww.eu/nodes/59b8e93cd54a862e9d7e4165 Depth buffer (z-buffer) Description The depth buffer is used to determine visibility, that is, which primitives in the scene are visible to the camera, and which are occluded by other primitives. This is an example of hidden surface removal. The depth buffer, or z-buffer, is si kn..
깊이 버퍼 (Depth buffer / z-buffer)여러 물체가 겹쳐 있을때 뭘 위에 그릴까? depth buffer 라는 것을 만들어서 depth가 얕은것만 그리면 된다. https://knowww.eu/nodes/59b8e93cd54a862e9d7e4165 Depth buffer (z-buffer) Description The depth buffer is used to determine visibility, that is, which primitives in the scene are visible to the camera, and which are occluded by other primitives. This is an example of hidden surface removal. The depth buffer, or z-buffer, is si kn..
2023.11.07 -
void Rasterization::Render(vector &pixels) { // 그래픽카드(GPU)의 특징 // 1. GPU가 훨씬 빠릅니다. 가급적 GPU 사용 // 2. CPU->GPU 복사가 느립니다. 한 번 넣어두고 반복 사용 // 3. GPU->CPU 복사는 더 느립니다. // 태양 그리기 this->vertexBuffer.resize(sun.vertexBuffer.size()); for (size_t i = 0; i vertexBuffer[i] = sun.vertexBuffer[i]; } this->indexBuffer = sun.indexBuffer; this->colorBuffer = sun.colorBuffer;..
2차원 애니메이션void Rasterization::Render(vector &pixels) { // 그래픽카드(GPU)의 특징 // 1. GPU가 훨씬 빠릅니다. 가급적 GPU 사용 // 2. CPU->GPU 복사가 느립니다. 한 번 넣어두고 반복 사용 // 3. GPU->CPU 복사는 더 느립니다. // 태양 그리기 this->vertexBuffer.resize(sun.vertexBuffer.size()); for (size_t i = 0; i vertexBuffer[i] = sun.vertexBuffer[i]; } this->indexBuffer = sun.indexBuffer; this->colorBuffer = sun.colorBuffer;..
2023.11.07 -
회전 역 코사인, 사인 함수로 phi(피)의 각도를 구하는 것도 가능하지만, 코사인-사인 법칙을 이용해서 다음과 같이 더 간단히 할 수 있다. (phi피가 사라짐) vec3 RotateAboutZ(const vec3 &v, const float &theta) { vec3 vp{v.x * cos(theta) - v.y * sin(theta), v.x * sin(theta) + v.y * cos(theta), 0.0f}; return vp; } Update() 함수 이동, 회전, 스케일 void Rasterization::Update() { // 애니메이션 구현 // GUI 입력에 대해서 vertexBuffer 업데이트 // 이 예제에서는 this->vertexBuffer만 업데이트하고 // colorBuf..
2차원 변환회전 역 코사인, 사인 함수로 phi(피)의 각도를 구하는 것도 가능하지만, 코사인-사인 법칙을 이용해서 다음과 같이 더 간단히 할 수 있다. (phi피가 사라짐) vec3 RotateAboutZ(const vec3 &v, const float &theta) { vec3 vp{v.x * cos(theta) - v.y * sin(theta), v.x * sin(theta) + v.y * cos(theta), 0.0f}; return vp; } Update() 함수 이동, 회전, 스케일 void Rasterization::Update() { // 애니메이션 구현 // GUI 입력에 대해서 vertexBuffer 업데이트 // 이 예제에서는 this->vertexBuffer만 업데이트하고 // colorBuf..
2023.11.07 -
원의 반지름과 각도 세타를 이용해서 삼각형의 정의 주의: 각 삼각형의 vertex를 이용해 삼각형을 그릴때 시계방향으로 vertex를 입력해야 정상적으로 삼각형이 그려진다. 인덱스 버퍼 삼각형을 여러개 그릴때는 vertex 수를 가급적 줄이고 이웃해 있는 삼각형끼리 같은 vertex를 공유해서 사용하는것이 훨씬 효율적. 어떤 삼각형을 그려라 라는게, 어떤 vertex들을 순서대로 그려라 라는 의미로 vertex 들의 index가 나열된 버퍼 메모리 공간을 사용한다. Rasterization::Rasterization(const int &width, const int &height) : width(width), height(height) { // 원을 그려봅시다. const auto radius = 0.5..
원 그리기원의 반지름과 각도 세타를 이용해서 삼각형의 정의 주의: 각 삼각형의 vertex를 이용해 삼각형을 그릴때 시계방향으로 vertex를 입력해야 정상적으로 삼각형이 그려진다. 인덱스 버퍼 삼각형을 여러개 그릴때는 vertex 수를 가급적 줄이고 이웃해 있는 삼각형끼리 같은 vertex를 공유해서 사용하는것이 훨씬 효율적. 어떤 삼각형을 그려라 라는게, 어떤 vertex들을 순서대로 그려라 라는 의미로 vertex 들의 index가 나열된 버퍼 메모리 공간을 사용한다. Rasterization::Rasterization(const int &width, const int &height) : width(width), height(height) { // 원을 그려봅시다. const auto radius = 0.5..
2023.11.07 -
좌표계 NDC(Normalized Device Coordinates) http://www.directxtutorial.com/Lesson.aspx?lessonid=111-4-1 DirectXTutorial.com First of all, I officially welcome you to Direct3D. I would like to teach you both the basics and the advanced topics of 3D programming. Whether you want to build your own engine, borrow one and modify it, or just buy one and use it, it is important that y www.directxtutorial.co..
삼각형 레스터화좌표계 NDC(Normalized Device Coordinates) http://www.directxtutorial.com/Lesson.aspx?lessonid=111-4-1 DirectXTutorial.com First of all, I officially welcome you to Direct3D. I would like to teach you both the basics and the advanced topics of 3D programming. Whether you want to build your own engine, borrow one and modify it, or just buy one and use it, it is important that y www.directxtutorial.co..
2023.11.05 -
역방향 광추적 여태까지 구현했던 역방향 광추적은 픽셀당 하나씩 ray를 쏴 줘야 하고 안티에일리어싱까지 하려면 더 많이 쏴야 한다. 게다가 물체가 많아지면 각 ray가 각 물체랑 모두 충돌여부를 따져야 한다. 만약 물체가 10개라면? 각 ray 당 물체 10개랑 모두 충돌 확인해야 한다. 그러면 1개일때보다 10배는 느려진다. 만약 물체가 1000개라면? 10000개라면?... 자료구조를 잘 활용하면 좀 빨라지긴 하지만, 아무리 그렇게 해도, 반사와 굴절 등을 모두 구현한 순수 ray tracing을 실시간 그래픽스 렌더링하기는 어렵다. 레스터화(rasterization) 레스터화의 장점은, 여러개의 삼각형을 따로따로 그리기 적합하다는 것. 삼각형은 vertex(정점) 세개로 정의할 수 있다. 레스터화 ..
레스터화(rasterization)가 빠른 이유역방향 광추적 여태까지 구현했던 역방향 광추적은 픽셀당 하나씩 ray를 쏴 줘야 하고 안티에일리어싱까지 하려면 더 많이 쏴야 한다. 게다가 물체가 많아지면 각 ray가 각 물체랑 모두 충돌여부를 따져야 한다. 만약 물체가 10개라면? 각 ray 당 물체 10개랑 모두 충돌 확인해야 한다. 그러면 1개일때보다 10배는 느려진다. 만약 물체가 1000개라면? 10000개라면?... 자료구조를 잘 활용하면 좀 빨라지긴 하지만, 아무리 그렇게 해도, 반사와 굴절 등을 모두 구현한 순수 ray tracing을 실시간 그래픽스 렌더링하기는 어렵다. 레스터화(rasterization) 레스터화의 장점은, 여러개의 삼각형을 따로따로 그리기 적합하다는 것. 삼각형은 vertex(정점) 세개로 정의할 수 있다. 레스터화 ..
2023.11.04 -
벡터 표기법 정리 그래픽스 수학 복습 포인트와 벡터 포인트 위치만 표현 예) 철수의 위치, 영희의 위치 벡터 방향과 크기 표현 예) 속도, 힘 포인트-벡터 연산 [주의] 대부분의 API에서는 포인트와 벡터를 구분해서 구현하지 않음 직선 (Line) 선분 Affine Combination 이런식으로 여러개의 Point 앞에 각각 스칼라(가중치)를 곱한 다음 더해주는것을 Affine Combination, 또는 Affine Sum 이라고 한다. 이때, 각 가중치를 모두 더하면 1이 되어야 한다. 벡터 더하기 행렬 벡터 벡터를 행렬형태로 많이 사용하게 되는데, 이때 세로로 길게 쓰면 보기 불편해서 Transpose해서 표현을 많이 함. 동차좌표 (Homogeneous Coordinates) 그래픽스에서 벡터를..
벡터와 포인트벡터 표기법 정리 그래픽스 수학 복습 포인트와 벡터 포인트 위치만 표현 예) 철수의 위치, 영희의 위치 벡터 방향과 크기 표현 예) 속도, 힘 포인트-벡터 연산 [주의] 대부분의 API에서는 포인트와 벡터를 구분해서 구현하지 않음 직선 (Line) 선분 Affine Combination 이런식으로 여러개의 Point 앞에 각각 스칼라(가중치)를 곱한 다음 더해주는것을 Affine Combination, 또는 Affine Sum 이라고 한다. 이때, 각 가중치를 모두 더하면 1이 되어야 한다. 벡터 더하기 행렬 벡터 벡터를 행렬형태로 많이 사용하게 되는데, 이때 세로로 길게 쓰면 보기 불편해서 Transpose해서 표현을 많이 함. 동차좌표 (Homogeneous Coordinates) 그래픽스에서 벡터를..
2023.11.04 -
투명한 물체를 구현하기 위해서는 처음 물체와 부딪힌 지점 d1와 뚫고 지나가서 안에서 밖으로 나올때 만나는 지점 d2를 고려해야 한다. 이때, 계산을 위해서 여태까지 처음맞은 지점을 찾기 위해 빛의 시작점으로부터 맞은 지점까지의 거리를 찾아서 더 짧은쪽이 먼저 맞은점이라고 판단하고 그것만 사용했었다. hit.d = glm::min(d1, d2); 이제는, 뚫고 안에 들어갔을때 빛을 계산할때는 더 먼지점인 d2를 사용해야 한다. 구 안에 있는 점에서 시작해서 d2까지를 계산할때는 d1이 시작점보다 뒤에 있기때문에 거리가 음수로 나올것이다. // 물체 안에서 다시 밖으로 나가면서 충돌 가능 if (hit.d < 0.0f) // hit.d = glm::max(d1, d2); https://samdriver.x..
투명한 물체와 빛의 굴절투명한 물체를 구현하기 위해서는 처음 물체와 부딪힌 지점 d1와 뚫고 지나가서 안에서 밖으로 나올때 만나는 지점 d2를 고려해야 한다. 이때, 계산을 위해서 여태까지 처음맞은 지점을 찾기 위해 빛의 시작점으로부터 맞은 지점까지의 거리를 찾아서 더 짧은쪽이 먼저 맞은점이라고 판단하고 그것만 사용했었다. hit.d = glm::min(d1, d2); 이제는, 뚫고 안에 들어갔을때 빛을 계산할때는 더 먼지점인 d2를 사용해야 한다. 구 안에 있는 점에서 시작해서 d2까지를 계산할때는 d1이 시작점보다 뒤에 있기때문에 거리가 음수로 나올것이다. // 물체 안에서 다시 밖으로 나가면서 충돌 가능 if (hit.d < 0.0f) // hit.d = glm::max(d1, d2); https://samdriver.x..
2023.11.02