전체 글 169

230531 Frustum Culling, 평면의 방정식

1. 랜더링 최적화 (이전에 안 한 것..) Frustum Culling 컬링 작업이 랜더링 파이프라인에서 레스터라이저에 의해서 발생한다. NDC 좌표계에 안 들어오는 정점들을 버린다. 그런데 NDC 좌표계 안 들어왔다고 해서 무조건 다 버리는 것은 아니다. 정점 3개 중 전부 다 NDC 좌표와 겹치는지 아닌지 검사를 해서 일부라도 팻치가 들어오는지 레스터라이저에서 판단을 해야한다. 3개 다 들어오지 않는 경우, 다 버리면 된다. 정점 3개가 다 NDC 좌표계에 들어왔더라도 반시계로 들어왔다면, cull_back 모드를 사용하고 있다는 전제하에 뒷면이라고 생각하고 컬링을 하면 된다. Frustum Culling은 랜더파이프라인에서 작동하는게 아니라(GPU) 우리가 직접 CPU로 자체적으로 컬링하는 전처리..

DirectX 11 3d 2023.06.04

230526 Tesselation - Patch Constant Function

Patch 하나 당 한번의 Patch Constant Function이 호출된다. // ======================= // Patch Constant Function // 패치의 분할 횟수를 지정하는 함수 // ======================== struct PatchOutput { float Edges[3] :SV_TessFactor; float Inside : SV_InsideTessFactor; } PatchOutput PatchConstFunc(InputPatch _input , uint PatchID : SV_PrimitiveID) { PatchOutput output = (PatchOutput) 0.f; // 예시 output.Edges[0] = 2.f; output.Ed..

DirectX 11 3d 2023.05.26

230525 LandScape, Tesselation

1. LandScape Component 만들기 지형을 그려야해서 랜더링 기능이 있어야 하기 때문에 RenderComponent 상속 받는다. #pragma once #include "CRenderComponent.h" class CLandScape : public CRenderComponent { private: UINT m_iFaceX; UINT m_iFaceZ; public: void SetFace(UINT _iFaceX, UINT _iFaceZ); virtual void finaltick() override; virtual void render() override; CLONE(CLandScape); public: CLandScape(); ~CLandScape(); }; 사용할 매쉬와 재질을 Set..

DirectX 11 3d 2023.05.26

230524 Decal에 Light 입히기

이전 수업.. 박스 랜더링하면서 구의 표면에 해당하는 부분을 포지션타겟에서 가져와서 박스내에 있다고 판단되면 컬러쪽에 덧그려서 색을 입힌다 (컬러타겟에) 문양을 광원으로 취급하고 싶다면 ? pObject->Decal()->SetAsLight(true) 를 해서 광원 취급으로 바꾼다. 실제 데칼에선 관련된 값을 쉐이더로 전달시킨다. SetAsLight(true)를 하면 Decal component에서 setscalarparam에서 int_0에 전달될 것이다. (int_0은 dacal.fx 에서 설정) if(g_int_0) { output.vEmissive = vSampleColor; } else { output.vColor = vSampleColor; } 알파블랜딩을 사용하고 있기 때문에 컬러타겟을 출력할..

DirectX 11 3d 2023.05.25

230523 Decal (다시 공부)

오늘 할 것. 1. hlsl Decal Shader 작성 2. ResMgr에서 쉐이더랑 Mtrl 작성 큐브안에 있는 부위만 구분하기 위해서 이미 그려져있던 포지션?을 가져와서 구분 // ============================ // Decal Shader // RS_TYPE : CULL_FRONT // DS_TYPE : NO_TEST_NO_WRITE // BS_TYPE : DEFAULT // Domain : DOMAIN_DECAL // ============================ pShader = new CGraphicsShader; pShader->SetKey(L"DecalShader"); pShader->CreateVertexShader(L"shader\\decal.fx", "VS_..

DirectX 11 _ 2 2023.05.24

230522 MRT 개선(EmissiveTargetTex) 및 Decal 생성

* MRT 개선 RenderMgr에서 DeferredTarget에 새로운 타겟 하나 넣어줌. (이제 타겟 총 5개) 새로운 타겟 -> EmissiveTargetTex 자체적으로 빛을 내는 발광물질이 있을 때 사용 ex) texture 1. 우주그림 2. 거기에 맞는 노말맵 -> 노말가져와서 울퉁불퉁하게 느낌.. 3. emissive 타겟 (리소스에 따라서 셋팅가능) -> 텅텅 비어있는데 중간에만 눈알?그림이 그려져있고 빨간색이 들어가있다. 광원으로 취급돼서 발광텍스쳐 눈알부분이 컬러로 들어가면 안되고 따로 emissive 에 들어가게 된다. EmissiveTarget은 나중에 광원처리 할 때, diffuse, specular, EmissiveTarget 셋을 광원처리한다. 전혀 빛이 없었어도 Emissi..

DirectX 11 3d 2023.05.22

230519 Stencil Buffer

Stencil Buffer는 Defurred 타겟을 활용하지 않고, Depth Stencil Texture를 활용한다. 1. 쉬운 버전 2. 난이도 좀 있는 개선버전 이젠 깊이도 통과해야하고 스텐실도 통과해야한다 . 1. 깊이텍스쳐는 디바이스에서 만든다 DepthStencilTex에 보면 DX format d24 s8 이렇게 되어있는데, 3바이트는 깊이값, 정수 1바이트(픽셀 포맷)는 스텐실 저장되는 깊이는 버텍스버퍼->레스터라이저->픽셀쉐이더 거쳐서 올 때, 픽셀단위로 sv position해서 넘기는 최종 ndc 좌표에서 깊이값(0 ~ 1 사이)을 기록한다. 이렇게해서 0 ~ 1 사이로 정점이 오고, 레스터라이저에서 정점단위의 깊이값을 보간해서 픽셀로 깊이값이 정해진다. 다음 물체가 그려질 때, 내가 ..

DirectX 11 3d 2023.05.20

230518 Light MRT - PointLight (다시 공부)

로컬 스페이스 좌표 x 월드 스페이스 좌표 = 월드 스페이스 좌표 (양쪽에 월드 스페이스 좌표의 역행렬을 곱하면..) 로컬 스페이스 좌표 = 로컬 스페이스 좌표 즉, 월드 좌표에 있는 것을 월드 역행렬을 곱해주면 다시 로컬좌표로 보낼 수 있다. 꼭 이 순서로 가지 않고, 각 역행렬 곱해주면 이전 공간계로 돌아갈 수 있다. 위에 사진에서 빨간색으로 색칠되어 평면과 빛이 겹쳐진 부분만 남기고 그 외는 discard를 하고 싶다. 이때 픽셀단위로 월드좌표가 있는데 여기에 월드의 역행렬을 곱하면 다시 로컬로 돌아가게 된다. (정점에 월드를 보간해서 넘기면 픽셀의 월드좌표를 알 수 있다, 뷰스페이스로 넘기면 픽셀단위로 뷰스페이스좌표를 알았던 것처럼..! 보간해서 들어오니까.) 그렇게 되면 월드에 어디에 있었든 무..

DirectX 11 3d 2023.05.20

230517 Light MRT - Directional Light (다시 공부..)

Light에 랜더함수를 호출하면, Light가 무슨 타입인지에 따라서 랜더링방식이 달라진다. why? 사용하는 매쉬와 재질이 달라지기 때문 Deferred 물체를 먼저 그려준 후, 빛을 입혀준다. (먼저 물체들에 정보들이 만들어지고) Directional Light 전용쉐이더 제작 // ============================ // Directional Light Shader // RS_TYPE : CULL_NONE // DS_TYPE : NO_TEST_NO_WRITE // BS_TYPE : DEFAULT // Domain : DOMAIN_LIGHT // ============================ pShader = new CGraphicsShader; pShader->SetKey(L"..

DirectX 11 3d 2023.05.18