从别人基础开始敲最差劲游戏引擎二_反射Shader的HLSL语法

Posted avi9111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从别人基础开始敲最差劲游戏引擎二_反射Shader的HLSL语法相关的知识,希望对你有一定的参考价值。

一般的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));

//非完整代码一
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;

*//最后发现巨坑,shader里面的类型是POSITION,但这里死活不能用RGBA,必须用RGB

以上是关于从别人基础开始敲最差劲游戏引擎二_反射Shader的HLSL语法的主要内容,如果未能解决你的问题,请参考以下文章

从别人基础开始敲最差劲游戏引擎三_顶点输入之法线(翻译向)

Unity Shader 之 基础光照

shader编程-RayMarching与SDF结合开始三维探索(WebGL-Shader开发基础07)

shader编程-RayMarching与SDF结合开始三维探索(WebGL-Shader开发基础07)

通过使用Unity Shader实现基础光照效果

通过使用Unity Shader实现基础光照效果