게임 개발/그래픽스
-
화면에 보이는 부분만 그리면 성능적인 이득을 볼 수 있다. 이것을 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