DX11渲染管道 :着色器的编译和创建

  • Post author:
  • Post category:其他


在不使用效果框架的时候,整个渲染管道其实挺简单的,创建资源,输入资源。编译着色器输入着色器,其实着色器本身也是一种数据,只不过这个数据描述的是逻辑。最后调用一下draw方法画一下就OK 了。这里说说着色器的编译和创建,很简单。


D3DX11CompileFromFile

HRESULT D3DX11CompileFromFile(
  _In_   LPCTSTR pSrcFile,  // 文件路径
  _In_   const D3D10_SHADER_MACRO *pDefines, // 可选,一个键值对数组,直接设置为NULL
  _In_   LPD3D10INCLUDE pInclude, // 可选,这个相当于C++的include命令也是一个数组。
  _In_   LPCSTR pFunctionName, // 入口方法的名字
  _In_   LPCSTR pProfile, // vs_5_0 
  _In_   UINT Flags1, // 着色器编译标志。
  _In_   UINT Flags2, // 效果编译标志。
  _In_   ID3DX11ThreadPump *pPump, // 线程?
  _Out_  ID3D10Blob **ppShader, // 编译后的结果
  _Out_  ID3D10Blob **ppErrorMsgs, // 编译后的错误信息
  _Out_  HRESULT *pHResult 
);


着色器编译标志

CreateVertexShader :

HRESULT CreateVertexShader(
  [in]   const void *pShaderBytecode, // ID3D10Blob 编译结果
  [in]   SIZE_T BytecodeLength, // ID3D10Blob 的size
  [in]   ID3D11ClassLinkage *pClassLinkage, // ID3D10Blob 使用到的外部class,连接的数组
  [out]  ID3D11VertexShader **ppVertexShader // 结果
);

其他的着色器也就这样。

例子:

        ID3D10Blob* errorMessage = nullptr;
	ID3D10Blob* vertexShaderBuffer; 
	ID3D11VertexShader* vertexShader; 

	WCHAR* wfilename = StringUtil::StringToWchar(filename);

	// 编译vs代码.
	D3DX11CompileFromFile(wfilename, NULL, NULL, "ColorVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, 
		&vertexShaderBuffer, &errorMessage, NULL); 
	
	// 从缓冲创建vs shader.
	result = pd3dDevice->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &vertexShader); 



版权声明:本文为l1987021原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。