분류 전체보기 (308) 썸네일형 리스트형 [그래픽스] Geometry Shader Geometry Shader는 기하 정보를 더 자세하게 만드는 쉐이더이다. 글로만 보면 잘 이해가 안되니 코드를 살펴보자. m_constantData.width = 2.4f; D3D11Utils::CreateConstantBuffer(device, m_constantData, m_constantBuffer); // Geometry shader 초기화하기 D3D11Utils::CreateGeometryShader( device, L"BillboardPointsGeometryShader.hlsl", m_geometryShader); Geometry Shader 역시 ConstantBuffer을 사용할 수 있기 때문에 GeometryShader을 위한 ConstantBuffer을 만들고 VS, PS와 같은 방.. [그래픽스] 쿼터니언(실습) 쿼터니언(이론)에서 배운 두번째 방법, 회전에 대한 쿼터니언 q를 구하고 그 쿼터니언으로부터 회전 행렬을 구해보자. 먼저 회전축 Vector3가 있어야하고 normalize로 정규화되어 있어야 한다. 이 회전축 Vector3을 n이라고 했을 때, 쿼터니언 생성자를 이용하면 회전에 대한 쿼터니언 q는 Quaternion q(n*sin(quatTheta*0.5f),cos(quatTheta*0.5f)) 가 된다. 이 쿼터니언을 Matrix::CreateFromQuaternion 함수에 넣으면 회전 행렬을 구할 수 있다. 쿼터니언 q를 구할 때도 사실 수식을 이용한 생성자가 필요없다. Quaternion::CreateFromAxisAngle(회전축, 회전각도)를 이용하면 회전축대로 회전각도만큼 회전한 쿼터니언을.. [그래픽스] 쿼터니언(이론) 오일러 각도를 이용해 회전을 하면 짐벌 락 현상이 발생한다. 오일러 각도를 이용할 때 세 축은 회전할 때 서로 종속적인데, 회전을 할 때 특정 상황에서 세 축 중 두 축이 겹쳐버리는 문제가 발생한다. 짐벌 락이 발생하면 세 축중 한 축이 소실되어버린다. 쿼터니언을 이용하면 하나의 회전축을 이용한 회전 각도를 표현할 수 있기 때문에 짐벌락 현상을 해결할 수 있다. 3차원 회전을 숫자 4개로 표현하는데 절대값이 1이라는 제약 조건이 있기 때문에 3자유도(DOF)가 있다. 벡터 v를 회전축 n에 대해 θ각도 만큼 회전 시키고 싶다면? 1.벡터에 0을 붙여 (v,0) 형태의 쿼터니언 p를 만든다. 2.회전을 표현하는 (n sin(θ/2) , cos(θ/2)) 형태의 쿼터니언 q를 만든다. 3.q의 켤레 쿼터니언.. [그래픽스] Picking (렌더타겟 2개 이용, GPU->CPU로 데이터 복사) m_context->ResolveSubresource(m_tempTexture.Get(), 0, backBuffer.Get(), 0, DXGI_FORMAT_R8G8B8A8_UNORM); D3D11Utils::WriteToFile(m_device, m_context, m_tempTexture, "captured.png"); context->ResolveSubResource GPU내부에서 텍스쳐를 복사하는 함수이다. 그리고 captured.png 파일을 만들기 위해 복사한 m_tempTexture을 이용해서 WriteToFile함수를 실행한다. 백버퍼를 바로 넣는 게 아니라 ResolveSubResource로 복사하는 이유는 첫번째로 멀티 샘플링 요소가 포함되어 있기 때문에 Texture2D형식으로 바꾸기 .. [그래픽스] 후처리 - 이미지 필터 이미지 필터는 화면 크기의 사각형을 그리는 쉐이더이다. D3D11_SAMPLER_DESC sampDesc; sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; D3D11_RASTERIZER_DESC rastDesc; rastDesc.DepthClipEnable = false; 이미지 처리를 할 때는 샘플러를 Clamp를 일반적으로 사용하기 때문에 Clamp로 해주고, 이미지이기 때문에 Depth가 필요없으므로 래스터라이저의 DepthClipEnable을 false로 해준다. ZeroMemory(&.. [그래픽스] Texturing Texture2D g_texture0 : register(t0); SamplerState g_sampler : register(s0); 텍스쳐를 원하는 위치에 가져오는 것을 샘플링이라고 한다. 물체에 텍스쳐를 입히기 위해서 쉐이더 코드에 위와 같이 전역변수 texture과 sampler이 필요하다. texture을 받을 때는 레지스터로 t, sampler을 받을 때는 레지스터로 s를 받는다. g_texture0.Sample(g_sampler, input.texcoord) 그리고 위 코드로 input의 texcoord에 texture을 가져올 수 있다. 텍스쳐는 CreateTexture2D로 만들고 쉐이더가 텍스쳐를 사용할 수 있게 CreateShaderResourceView로 만든다. 텍스쳐를 쉐이더의 .. [그래픽스] 투영 변환에서 z값을 나누는 시점 DirectX에서 투영 변환을 진행할 때 XMMatrixPerspectiveFovLH 함수를 통해 투영 변환 행렬을 만든다. 그런데 정확히 말하면 여기서 투영 변환 행렬을 곱하기만 하고 z로 나누지는 않는다. z로 나누어야 NDC(Normalized Device Coordinates) 정규화된 좌표계로 변환이 완료된 것이기 때문에 엄밀히 말하면 XMMatrixPerspectiveFovLH를 했다고 해서 투영 변환이 완료된것은 안디ㅏ. 정확히는 DrawIndexed 이후 렌더링 파이프라인이 내에서 Input Assmbley 이후 변환을 진행할 때 z값으로 나누면서 투영 변환이 완료된다. [그래픽스] 렌더링 파이프라인 Geometry 정의 물체를 그리기 위해 물체의 정보가 있어야 한다. vertices 정보 ( position, color, normal 등) 와 indices 정보를 넣어준다. Buffer 생성 GPU로 데이터를 옮기기 위해 정점 정보를 가진 VertexBuffer, index 정보를 가진 IndexBuffer, 변환 정보를 가진 ConstantBuffer을 생성한다. CreateVertexBuffer Geometry 정의할 때 만든 vertices 벡터를 GPU에서 사용하기 위한 D3D11Buffer로 만드는 과정이다. D3D11_BUFFER_DESC 구조체를 통해 D3D11Buffer의 정보를 세팅한다. 정점 정보는 GPU에서 수정할 일이 없으므로 Usage를 IMMUTABLE (GPU에서 읽기만 .. 이전 1 ··· 4 5 6 7 8 9 10 ··· 39 다음