一般的DirectX的渲染流程是
1. Set Vertex Input
2. SetVertex Buffer
3.1 SetMatrix
3.6. SetShader(Compiled)
这几个流程,都需要一个结构体
几乎都是从一开始,第一步之前就需要一个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)); //非完整代码一 vectorvecInputElementDesc; 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; }
*//最后发现巨坑,shader里面的类型是POSITION,但这里死活不能用RGBA,必须用RGB



