一般的なDirectXレンダリングプロセスは
1.頂点入力を設定します
2.SetVertexバッファー
3.1 SetMatrix
3.6。SetShader(コンパイル済み)
これらのプロセスはすべて構造が必要です
ほとんど最初から、最初のステップの前にc++構造が必要です
可能性はありますか
Unityのソースコードは解決策を提供します:
HRESULT CreateInputLayout(
[in] const D3D11_INPUT_ELEMENT_DESC *pInputElementDescs, //输入变量的声明,见下一个结构体
[in] UINT NumElements, //变量个数
[in] const void *pShaderBytecodeWithInputSignature, //ID3D10Blob buffer开始点
[in] SIZE_T BytecodeLength, //ID3D10Blob buffer长度
[out, optional] ID3D11InputLayout **ppInputLayout //返回的inputLayout,后面shader vertex input 有用到
);
typedef struct D3D11_INPUT_ELEMENT_DESC {
LPCSTR SemanticName;
UINT SemanticIndex;
DXGI_FORMAT Format;
UINT InputSlot;
UINT AlignedByteOffset; //上一input的长度,第一个input这里填0
D3D11_INPUT_CLASSIFICATION InputSlotClass;
UINT InstanceDataStepRate;
} D3D11_INPUT_ELEMENT_DESC;
//非完整代码,D3DCompiler提供D3DReflect()这个方法
ID3D11ShaderReflection* vsShaderReflection = nullptr;
HR(D3DReflect(pVertexShaderBlob->GetBufferPointer(), pVertexShaderBlob->GetBufferSize(), IID_ID3D11ShaderReflection, (void**)&vsShaderReflection));
//非完整代码一
vector<D3D11_INPUT_ELEMENT_DESC> vecInputElementDesc;
D3D11_SHADER_DESC vertexShaderDesc;
HR(vertexShaderReflection->GetDesc(&vertexShaderDesc));
//非完整代码二
3D11_SIGNATURE_PARAMETER_DESC signatureParamDesc;
vertexShaderReflection->GetInputParameterDesc(inputParamIndex, &signatureParamDesc);
//最后发现巨坑,shader里面的类型是POSITION,但这里死活不能用RGBA,必须用RGB
else if (signatureParamDesc.Mask <= 15)
{
if (D3D_REGISTER_COMPONENT_UINT32 == signatureParamDesc.ComponentType)
{
inputElementDesc.Format = DXGI_FORMAT_R32G32B32A32_UINT;
inputElementDesc.Format = DXGI_FORMAT_R32G32B32_UINT;
}
else if (D3D_REGISTER_COMPONENT_SINT32 == signatureParamDesc.ComponentType)
{
//inputElementDesc.Format = DXGI_FORMAT_R32G32B32A32_SINT;
inputElementDesc.Format = DXGI_FORMAT_R32G32B32_SINT;
}
else if (D3D_REGISTER_COMPONENT_FLOAT32 == signatureParamDesc.ComponentType)
{
//inputElementDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
inputElementDesc.Format = DXGI_FORMAT_R32G32B32_FLOAT;
}
alignedByteOffset += 12;
}
* //巨大なピットがついに見つかりました。シェーダーのタイプはPOSITIONですが、ここではRGBAを使用できません。RGBである必要があります。