응애맘마조
220106 강의 본문
어제 말했던 대로 VS에 들어갔습니다. 오늘이 가장 어렵다고 하네요.
IA에서 VS로 넘겨주게 될 때 position과 color값을 넘기게 됩니다.
이 사이에 넘겨주는 값을 InputLayout이라고 했습니다.
struct VertexInput
{
float4 position : POSITION0;
float4 color : COLOR0;
};
float4는 float이 4개 붙어있다고 보시면 됩니다. (4Byte × 4 = 16Byte로 볼 수 있습니다.)
위의 코드에서 POSITION0, COLOR를 시맨틱(semantic)이라고 하고 용도를 나타냅니다.
Layout에서 넣은 값들을 IA출력으로 넘기고 그게 VS의 입력으로 들어갑니다.
D3D11_INPUT_ELEMENT_DESC는 VS에 들어온 원소들을 배치합니다.
R32G32B32는 32비트를 의미합니다. 32비트는 4바이트이고 결국 12바이트를 의미합니다.
{
D3D11_BUFFER_DESC desc = { 0 };
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.ByteWidth = sizeof(Matrix);
desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
desc.StructureByteStride = 0;
HRESULT hr = D3D->GetDevice()->CreateBuffer(&desc, NULL, &WVPBuffer);
assert(SUCCEEDED(hr));
}
D3D->GetDC()->VSSetConstantBuffers(0, 1, &WVPBuffer);
{
D3D11_BUFFER_DESC desc = { 0 };
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.ByteWidth = sizeof(Color);
desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
desc.StructureByteStride = 0;
HRESULT hr = D3D->GetDevice()->CreateBuffer(&desc, NULL, &colorBuffer);
assert(SUCCEEDED(hr));
}
D3D->GetDC()->VSSetConstantBuffers(1, 1, &colorBuffer);
위의 코드는 position과 color값을 넘겨주는 코드입니다.
다른 부분이라면 마지막줄에 0, 1이 다른데
0번이 LayoutDesc[0]을 의미하고 0 ~ 12를 사용하는 position이고
1번이 LayoutDesc[1]을 의미하고 12 ~ 24를 사용하는 color입니다.
이 값을 상수버퍼(cbuffer)로 넘기게 되는데 상수버퍼는 16바이트씩 읽는 것이 특징입니다.
(16바이트 미만으로 데이터를 넘긴다면 읽지 않고 넘어가버리기 때문에 사용되지 않는 값은 비어있는 값(0)으로 맞춰서 넘겨줘야 상수버퍼가 읽고 넘기게 됩니다.)
살짝 궁금증이 생길 수도 있는데 렌더링 파이프라인 과정에서는
IA → VS → RS순서로 가야되는데 어제도 그렇고 오늘도 RS로 넘어가지 않고 PS로 넘어가는 것을 확인할 수 있었습니다.
그 이유는 렌더링 파이프라인 과정에서 정점 처리를 하게 되는데 RS에서는 정점 처리를 하지 않습니다. 그래서 따로 과정이 들어있지 않습니다.
mul은 multiple을 의미하고 곱셈, 배수라는 뜻을 가지고 있습니다.
WVP는 최종행렬입니다. VS에서는 position × SRT를 하는데 SRT 부분에 WVP를 넣어서 사용합니다.
하지만 우리가 갖고 있는 값은 postion과 color값입니다. SRT는 갖고 있지 않습니다.
WVP.Transpose를 WVP에 저장합니다. 여기서 Transpose는 전치행렬입니다.
CPU와 GPU 사이에는 자원을 자유롭게 주고 받을 수 없습니다. 그래서 이 사이에 서브 버퍼를 만들어서 사용합니다.
(둘이 동시에 접근을 하면 안되기 때문에 사이에 서브 버퍼를 만들고 WVP값을 이 서브 리소스에 저장하고 WVPBuffer에 저장하고 Map함수를 사용합니다. 그래서 위의 코드에서 Usage에 D3D11_USAGE_DYNAMIC을 사용합니다.)
WVP에서 VP는 카메라입니다. RS와 밀접한 관계를 갖고 있습니다.
다음은 색상에 관한 것인데 항상 0 ~ 1 사이의 값을 넣어서 색상을 지정했습니다. 벡터로도 볼 수 있다고 했습니다.
saturate와 관계가 있는데 포화시키다 라는 의미가 있습니다.
0 ~ 1 사이에 원하는 값을 넣고 2를 곱하고 1을 빼면 됩니다.
여태 색상 지정은 이 공식을 통하여 지정 되었습니다.
다음 주 월요일은 RS에 대해서 강의한다고 했습니다.
읽어주셔서 감사합니다.