在HLSL中修改全局texture3d变量

时间:2015-05-20 21:08:17

标签: directx shader hlsl

我如何制作一个可以在几何着色器(HLSL)中修改的全局texture3d变量?

大小为64x64x64。

我会在第一个renderpass中填充一次,然后在第二个renderpass中使用它。

任何帮助表示赞赏。最好使用D10。

编辑:

按照此http://http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html指南制作行进立方体地形着色器(参见第1.4段)。我得到了几何着色器,只是因为我没有法线并且指南建议我可以通过在texture3D中存储数据来创建它们但我不知道如何将数据放入texture3D。 (该指南使用的是DX10)。

2 个答案:

答案 0 :(得分:2)

您可能正在考虑使用计算着色器。在这种情况下,您可以在计算着色器中将纹理声明为RWTexture3D,然后在渲染过程中将其作为Texture3D进行采样。有关计算着色器的互联网上有许多资源/教程/示例可帮助您入门。

您无法在D3D11中使用几何着色器修改纹理。 geometry shader唯一能做的就是生成基元。但是,正如@Adam Miles回答说明的那样,可以在D3D11.1中的几何着色器中编写RWTexture3D。虽然这是可行的,但除非您还使用几何着色器生成基元,否则在计算着色器中执行它可能是最有意义的。

如果您通过D3D11 API在D3D 10.x中工作,您仍然可以使用compute shaders,但不能使用RWTexture3D类型。您必须将其视为RWByteAddressBuffer,并自行编制索引,这有点尴尬。您不一定需要在着色器中生成纹理数据,您可以使用CPU写入纹理,通过映射并直接写入数据。有关详细信息,请参阅ID3D10Texture3D::Map

答案 1 :(得分:0)

如果您愿意支持Direct3D 11.1以上的卡,可以实现您使用RWTexture3D的要求,与其他答案相反。

您可以将64x64x64 RWTexture3D绑定到Geometry Shader阶段,并以与计算着色器相同的方式写入它。

请参阅Use UAVs at every pipeline stage了解现在的情况。