在不使用效果框架的时候,整个渲染管道其实挺简单的,创建资源,输入资源。编译着色器输入着色器,其实着色器本身也是一种数据,只不过这个数据描述的是逻辑。最后调用一下draw方法画一下就OK 了。这里说说着色器的编译和创建,很简单。
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 版权协议,转载请附上原文出处链接和本声明。