2013-02-01 70 views
0

将顶点着色器,像素着色器等缓存到设备/设备上下文中,而不必每次都从文件系统重新加载它们的最佳方法是什么?如何缓冲许多顶点,几何和像素着色器

ID3D11Device :: CreateVertexShader http://msdn.microsoft.com/en-us/library/windows/desktop/ff476524(v=vs.85).aspx

ID3D11DeviceContext :: VSSetShader http://msdn.microsoft.com/en-us/library/windows/desktop/ff476493(v=vs.85).aspx

设备是否:: CreateVertexShader缓冲系统中的着色器(不GPU),存储器的一个实例?我可以缓冲多于1吗?

DeviceContext :: CreateVertexShader是否在GPU(非系统),内存中缓冲着色器的单个实例?我可以缓冲多于1吗?

缓冲系统内着色器的推荐方法是什么?

谢谢!

+3

你从哪里得到一次只能创建一个顶点着色器的想法? –

回答

2

当您使用ID3D11Device :: CreateVertexShader,您检索到它们的引用,将代表GPU的顶点着色器,所以如果你有3个顶点着色器,你做的事:

ID3D11VertexShader* vsref1; 
ID3D11VertexShader* vsref2; 
ID3D11VertexShader* vsref3; 

CreateVertexShader(bytecode1,sizeofbytecode1,NULL,&vsref1); 
CreateVertexShader(bytecode2,sizeofbytecode2,NULL,&vsref2); 
CreateVertexShader(bytecode3,sizeofbytecode3,NULL,&vsref3); 

确保您跟踪vsref1,2和3(就像班级成员一样)。一旦创建完成,它们就会上传到您的gpu,无需再次执行,然后调用VSSetShader来选择要使用哪一个。

然后你可以使用你的顶点着色器分配到管道随时随地:

VSSetShader(vsref1,NULL,0); 

VSSetShader(vsref2,NULL,0); 

不会导致上载,它只是告诉你的GPU它的Vertex Shader你想要用于下一个Draw调用。

+0

这太棒了! VertexShaderPtr-> Release()会从GPU中移除着色器吗?总的来说,我不认为你知道我在哪里可以找到图表,文档,解释CPU和GPU内存,缓冲区等之间的交互情况? “这个方法在CPU内存中实现了着色器,这个方法把它与GPU内存绑定,这个方法将它设置为活动状态......但是对于顶点缓冲区,常量等东西,但更重要的是资源和纹理。你的帮助! –

+0

是的发布会从GPU中删除它(请注意所有directx对象都是引用计数器),关于图表我从不同的演示文稿中获得了关于dx11渲染的幻灯片,如果你愿意,我可以给你发一个链接。有一些教程正在制作中,但它们尚未发布(有些使用c#/ SlimDX,有些使用原始的C++/dx11) – catflier

+0

我一直认为Create方法通常使CPU承载缓冲区,而Set会绑定到GPU看起来好像你在说Create是Binds,Set是什么使得缓冲区,纹理等被激活,缓冲区的工作方式与此相同?CreateVertexBuffer创建一个GPU托管缓冲区,而IA Set Buffers只是改变ac tive缓冲区等?再次感谢你的帮助。 –

相关问题