본문 바로가기

분류 전체보기

(308)
[그래픽스] DirectX 초기화 D3D11CreateDevice Device와 DeviceContext를 만드는 것이 주된 함수이다. DirectX 버전 설정 가능. DXGI_SWAP_CHAIN_DESC 스왑체인의 정보를 담는 구조체이다. 더블 버퍼링을 위해 두개의 버퍼를 교체하는데 이것을 스왑체인이라고 한다. 백버퍼 해상도, 프레임 레이트 설정 가능. device->CreateRenderTargetView RenderTargetView 설정하는 함수이다. 예제 프레임워크에서는 처음에 RenderTargetView를 SwapChain의 백버퍼로 설정한다. RenderTargetView는 여러개가 존재할 수 있으며 SwapChain의 백버퍼 말고 다른것으로도 설정 가능하다. ID3D11Texture2D 백버퍼의 자료형이다. 픽셀의 색깔 ..
23.06.14 - 알파 테스팅, 알파 블렌딩에서 정렬 지난번에도 언급한적이 있지만 알파테스팅은 알파값에 따라 일정 부분을 아예 지워버리는 것이고 알파 블렌딩은 다른 객체와 색을 섞는 것이다. 그래서 객체를 그릴 때 알파 테스팅, NonBlend 객체가 알파 블렌딩, Blend 객체보다 우선시되어야 한다. Blend객체는 주변의 색과 섞기 때문에 나중에 그려도 된다. m_pGraphic_Device->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); m_pGraphic_Device->SetRenderState(D3DRS_ALPHAREF, 100); m_pGraphic_Device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER); 위 코드는 알파테스팅 코드이다. 알파값 기준점을 100으로 잡..
23.06.12 - Cube Mapping, Skybox Skybox는 게임에서 하늘을 볼 때 현실처럼 모든 면이 자연스럽게 이어져 보이게 해준다. 카메라 주위를 하나의 박스로 감싸는 것이다. 구로 감쌀 수도 있지만 이번에는 cube로 감싸는 cube mapping에 대해 알아보자. 큐브 매핑에 사용되는 텍스쳐는 위와 같이 정육면체 전개도처럼 되어있다. 6개면의 텍스쳐를 한번에 바인딩한다. 정점의 TextureCoord는 기존에는 텍스쳐의 어떤 부분을 표현할지 좌표를 저장했지만, 큐브 매핑에서는 큐브의 중앙 기준으로 어떤 방향인지 방향벡터를 가진다. pVertices[0].vPosition = m_pVerticesPos[0] = _float3(-0.5f, 0.5f, -0.5f); pVertices[0].vTexcoord = pVertices[0].vPositi..
23.06.09 - Picking Picking은 마우스를 클릭했을 때 클릭한 화면의 좌표를 통해 어떤 삼각형을 선택했는지 확인할 수 있다. D3DXIntersectTri함수는 정점3개와 Ray의 시작점, 방향벡터를 받아 Ray의 시작점부터 정점 3개가 이루는 평면의 충돌여부와 충돌점까지의 거리를 알 수 있다. 우리는 VIBuffer안에서 D3DXIntersectTri함수를 통해 버퍼의 어떤 삼각형과 충돌했는지 알아낼 것이다. VIBuffer 내부에서 계산해야하므로 마우스를 클릭한 지점으로 쏘는 Ray를 VIBuffer의 로컬 좌표계까지 변환해야한다. 마우스 클릭은 뷰포트부터 이루어지므로 로컬좌표계까지는 긴 여정이 될 것이다. 뷰포트 -> NDC vMousePos.x = ptMouse.x / (rcClient.right * 0.5f) -..
23.06.08 - 빌보드, 평면의 방정식을 이용한 지형 타기 빌보드 빌보드는 버퍼가 항상 카메라를 바라보도록 처리 하는 것이다. 항상 카메라를 바라봐야 하므로 이펙트 등을 처리할 때 효과적이다. 방법은 물체의 월드 행렬 회전 값(1행,2행,3행)에 카메라의 월드 행렬 회전 값(1,2,3행)을 넣어주면 된다. 카메라의 월드 행렬은 뷰 변환 행렬의 역행렬이다. _float4x4CameraWorldMatrix; m_pGraphic_Device->GetTransform(D3DTS_VIEW, &CameraWorldMatrix); D3DXMatrixInverse(&CameraWorldMatrix, nullptr, &CameraWorldMatrix); m_pTransformCom->Set_State(CTransform::STATE_RIGHT, *(_float3*)&Camera..
23.06.07 - SetSamplerState, MipMap(밉맵), 높이 맵 SetSamplerState 이미지를 렌더링할 때 카메라가 너무 가까이 있으면 이미지의 픽셀이 깨져보인다던지, 너무 멀리 있으면 이미지가 자글자글하게 보이는 경우가 있다. SetSamplerState를 통해 샘플링 상태를 설정해서 이 상태를 어느 정도 해결할 수 있다. 설정 가능한 필터는 MAGFILTER, MINFILTER, MIPFILTER가 있다. MAGFILTER을 LINEAR로 설정하면 이미지가 확대되었을 때 색을 선형보간해서 부드럽게 보여주고 MINFILTER을 LINEAR로 설정하면 이미지가 축소되었을 때 색을 선형보간해서 부드럽게 보여준다. POINT로 설정하면 반대로 선형보간하지 않고 그대로 출력한다. MIPFILTER는 밑에 밉맵에서 설명하겠다. 또 텍스쳐의 ADDRESSING MODE..
[그래픽스] non-uniform scaling에서 normal vector 변환 평면의 scaling, rotation, translation 할 때마다 평면의 normal vector도 그에 따라 변환을 해줘야 한다. rotation, translation은 normal vector에도 같은 변환행렬을 곱해주면 되지만, scaling의 경우 그대로 곱해줄 경우 normal vector의 잘못된 변환이 일어날 수 있다. 정확히는 non-uniform scaling에서 normal vector에 scaling 행렬을 그대로 곱해주면 잘못된 변환이 일어난다. uniform scaling이란 모든 축이 같은 크기로 scaling 하는 것이고 non-uniform scaling은 그게 아닌 거다. 위 그림의 경우 y축은 그대로인데 x축만 scaling이 되었다. 즉, non-uniform ..
23.05.30 - 직교 투영 행렬 만들기 직교 투영은 카메라의 영향을 받지 않고 원근감을 적용시키지 않기 때문에 원근 투영과 다르게 투영행렬을 따로 만들어줘야 한다. 왼쪽의 월드 행렬에서 좌표 변환을 통해 오른쪽과 같은 NDC(Normalized Device Coordinate), 정규좌표로 만들어줘야 한다. 중간에 뷰 변환 행렬은 어디갔냐고? 카메라의 영향을 받지 않기 때문에 월드 행렬을 그대로 넘겨주기 위해 뷰 변환 행렬은 항등행렬이다. 좌표를 변환하려면 어떻게 해야 할까? 그림대로라면 화면의 SizeX가 1280, SizeY가 720일 때 위치좌표는 중앙이므로 (640,360)이 될 것이고 이 좌표가 NDC에서 (0,0)이 되어야 할 것이다. m_fSizeX = 1280.0f; m_fSizeY = 200.0f; m_fX = m_fSizeX..