11.07

신승빈·2022년 11월 7일
0

KGCA 수업

목록 보기
65/128

보간

보간을 위해 SRT를 저장해놓는 것이 좋음
DirectX에서 SRT 분리 함수 지원(DirectX::XMMatrixDecompose())
DirectX에서 보간을 위한 함수 지원(DirectX::XMVectorLerp(), DirectX::XMQuaternionSlerp())
보간 역시 부모의 보간과 자식의 보간을 따로 처리해야 한다

Character Animation

스키닝

Reference : https://www.youtube.com/watch?v=tMjHWakXXhg
Reference : https://danac.tistory.com/99

간단하게 설명하자면 Bone에 Skin을 까는 행위
자세하게 설명하자면, Rigid Body는 Matrix변환에 의해 그 형태가 변하지 않기 때문에, Bone계층 구조를 통해 나타낸 Object의 경우 관절부 사이에 각진 Object 표현이 발생

무릎이나 팔꿈치의 표현에 주의 이러한 어색한 표현으로부터 자연스러운 피부를 표현하기 위해 모든 Skin Mesh는 Bone에 상대적으로 영향을 받는다 가정하고, Bone의 움직임에 따라 Skin Mesh의 Vertex Position을 계산하는 방법

이를 통해 Rigid Body한 Mesh도 그 형태에 변형이 가능
이 외에 가상의 Bone을 통해 Character의 호흡같은 연출도 가능할 듯

계산법

VWorld=VLocali=0i<n(M[i]W[i])V_{World} = V_{Local} \sum _{i = 0} ^{i < n} (M[i] * W[i])
M[i]=Bone의이동행렬M[i] = Bone의 이동 행렬
W[i]=Bone에대한가중치W[i] = Bone에 대한 가중치
W[i]=1\sum W[i] = 1
일반적으로 최대 4개의 Bone에 대해서만 영향을 받도록 설정
Mesh가 Skinning된다면 Normal 역시 추가적인 계산 필요

Multi Stream

DirectX의 Buffer는 Shader에 넘길 때 한번에 정보를 넘기기 때문에, 다수의 Buffer로 구성되어있어도 1개의 Shader Struct을 구성하는게 가능

		D3D11_INPUT_ELEMENT_DESC ied[] =
		{
			{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,0,D3D11_INPUT_PER_VERTEX_DATA, 0},
			{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT,   0,12,D3D11_INPUT_PER_VERTEX_DATA, 0},
			{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0,24,D3D11_INPUT_PER_VERTEX_DATA, 0},
			{ "TEXTURE", 0, DXGI_FORMAT_R32G32_FLOAT,    0,40,D3D11_INPUT_PER_VERTEX_DATA, 0},
			// 다른 Buffer로 구성될 경우 4번째 인수로 Slot정보 구분 필수
            // 동일한 이름은 사용 가능하지만 2번째 매개변수로 구분 필요
			{ "INDEX", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1,0,D3D11_INPUT_PER_VERTEX_DATA, 0},
			{ "WEIGHT", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1,16,D3D11_INPUT_PER_VERTEX_DATA, 0},
		};

		// 이 방법으로 다수의 Buffer를 한번에 넘기거나 따로따로 넘길 수 있음
        // 이 방식을 통해 다수의 Buffer로 Mix가 가능
		UINT stride[2] = { sizeof(PNCT_VERTEX), sizeof(IW_VERTEX) }; // 정점1개의 바이트용량
		UINT offset[2] = { 0, 0 }; // 정점버퍼에서 출발지점(바이트)
		//SLOT(레지스터리)
		ID3D11Buffer* buffer[2] = { m_pSubVB[iSubObj],m_pSubVB_IW[iSubObj] };
		m_pImmediateContext->IASetVertexBuffers(0, 2, buffer, stride, offset);
profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글