在不使用效果框架的时候,整个渲染管道其实挺简单的,创建资源,输入资源。编译着色器输入着色器,其实着色器本身也是一种数据,只不过这个数据描述的是逻辑。最后调用一下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);