是否有任何DirectX 11(HLSL 5.0)等效于DirectX 9纹理"字符串函数"句法?

时间:2017-02-01 14:17:12

标签: c++ directx directx-11 hlsl directx-9

我目前正在使用GPU Gems 2书中的源代码,我试图将Improved Perlin Noise implementation (Chapter 26)转换为与DirectX 11一起使用。虽然相对无痛,但他们的优化还是很好的。由于使用纹理来辅助查找,因此使用起来有点麻烦。原始代码使用一种现在看似已经不存在的方法来声明我不知道如何转换为现代DirectX的纹理。

纹理声明类型的一个例子我的意思是: (来自inoise.fxh文件)

texture permTexture
<
    string texturetype = "2D";
    string format = "l8";
    string function = "GeneratePermTexture";
    int width = 256, height = 1;
>;

纹理类型,格式,宽度和高度我理解如何在着色器外部进行配置,string function = "GeneratePermTexture"部分虽然引起了我的注意。

它所指的功能:(在同一档案中)

float4 GeneratePermTexture(float p : POSITION) : COLOR
{
    return permutation[p*256] / 255.0;
}

在文件的这一部分上面有一条评论(其中包含更多针对各自纹理的函数),说// Functions to generate textures using CPU runtime

有没有简单的方法用Dx11做到这一点?我目前的调查建议我应该使用CreateTexture函数的D3D11_SUBRESOURCE_DATA *pInitialData部分。

1 个答案:

答案 0 :(得分:2)

纹理声明中<>之间的内容称为annotations。虽然D3DX9中的效果系统有几个"standard annotations",但“功能”似乎不是其中之一。标准注释主要由外部工具用于帮助创作着色器,例如在RenderMonkey中。

这些值在DirectX的上下文中不提供实际的额外功能,但可能充当元数据,C ++代码将使用它来生成纹理。可以使用GetAnnotationGetAnnotationByName函数查询注释值(使用C ++)。如果要将它们移植到DirectX 11,您只需在C ++代码中对这些值进行硬编码,或者从数据文件中加载它们。