DirectX 9 HLSL与DirectX 10 HLSL:语法相同吗?

6

在过去的一个月左右,我一直在努力学习DirectX。因此,我一直在DirectX 9和10之间来回切换。其中一个主要的变化是如何在图形卡中处理向量。

我注意到的一个重大变化是如何让GPU识别您的结构体。在DirectX 9中,您需要定义灵活的顶点格式。

您通常的设置应该像这样:

#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

在DirectX 10中,我相信等效的内容是输入顶点描述:
D3D10_INPUT_ELEMENT_DESC layout[] = {
    {"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT, 0 , 0,
        D3D10_INPUT_PER_VERTEX_DATA, 0},
    {"COLOR",0,DXGI_FORMAT_R32G32B32A32_FLOAT, 0 , 12,
        D3D10_INPUT_PER_VERTEX_DATA, 0}
};

我注意到在DirectX 10中它更具描述性。除此之外,还有哪些重大变化,并且HLSL语法是否相同?


在DX9中不应使用FVF,它只是从DX8遗留下来的,以使移植更容易。建议您使用D3DVERTEXELEMENT9数组来描述缓冲区的布局(非常类似于D3D10的方式,只是它使用一组固定的枚举而不是字符串作为参数名称)。 - Grant Peters
3个回答

7
我认为在DX9和DX10(以及DX11)之间的HLSL语法本身没有根本性的变化。
正如codeka所说,更改更多地是API的清理和通用化的发展(为了GPGPU)。但确实存在明显的差异:
明显的差异:
- 要将常量传递到着色器中,现在必须通过常量缓冲区进行。 - 共同的着色器核心:所有类型的着色器都可以访问相同的内置函数集(有一些例外,例如GS阶段)。整数和位运算现在完全符合IEEE标准(而不是通过浮点数模拟)。您现在可以访问二进制转换来将int解释为float,将float解释为uint等等。 - 纹理和采样器已分离。现在使用语法g_myTexture.Sample(g_mySampler, texCoord)代替tex2D(g_mySampledTexture, texCoord)。 - 缓冲区:一种新的资源类型,用于以随机访问方式访问不需要过滤的数据,使用新的Object.Load函数。 - 系统值语义:POSITION、DEPTH、COLOR语义的通用化和扩展,现在是SV_Position、SV_Depth、SV_Target,并添加每个阶段的新语义,如SV_InstanceID、SV_VertexId等。
这就是我目前看到的全部内容。如果我想到了什么新东西,我会更新我的答案。

1
我注意到DX9和DX10之间最大的变化是,在DX10下,您需要设置整个渲染状态块,而在DX9下,您可以更改单个状态。这在一定程度上破坏了我的架构,因为我相当依赖于能够进行小的更改并保留所有其他状态不变(只有在从着色器设置状态时才会出现问题)。
另一个重大变化是,在DX10下,顶点声明与已编译的着色器相关联(在CreateInputLayout中)。在DX9下,情况并非如此。您只需设置声明并设置着色器即可。在DX10下,您需要创建一个着色器,然后创建一个附加到给定着色器的输入布局。
正如codeka指出的那样,自从DX9推出以来,D3DVERTEXELEMENT9一直是创建着色器签名的推荐方法。FVF已经过时,通过FVF,您无法执行诸如设置切线基础等操作。顶点布局要强大得多,不会使您固定在布局上。您可以将顶点元素放在任何位置。

如果你想了解更多关于DX9输入布局的内容,我建议你从MSDN开始。


你的第二点实际上存在于大多数DX9的实现中,只是它位于驱动程序级别。这意味着每次将不同的着色器分配给不同的顶点声明时,它都必须重新解析二进制汇编代码以匹配输入寄存器和它们在着色器中的使用位置(这正是d3d10中发生的情况)。他们基本上只是允许你自己管理它,这样你就不会有额外的性能损失(通常是没有意识到的)。 - Grant Peters

0

FVFs(灵活顶点格式)已经(kind-of)被D3DVERTEXELEMENT9(又名顶点声明)所取代——这与D3D10_INPUT_ELEMENT_DESC非常相似。实际上,DirectX 10中的大多数内容与DirectX 9中的内容非常相似,除了固定函数管线。

DirectX 9和DirectX 10之间最大的变化是API的清理(在关注点分离方面,使其明确哪些阶段属于管道的哪个阶段等方面进行了改进)。


我不知道DirectX9有固定函数。我以为固定函数是无法创建自己独特的着色器的能力不足。DirectX 9允许您创建自己的着色器。 - numerical25
我找不到任何教程,甚至都没有提到D3DVERTEXELEMENT9。 - numerical25
2
固定函数是在不使用着色器的情况下进行渲染的能力。在DirectX 9中,着色器是可选的。 - Alan
很遗憾,你在互联网上找到的大多数DirectX教程质量都相当差...不过,实际上DirectX文档对于描述如何使用那些顶点声明还是不错的。 - Dean Harding
你说得对,我确实注意到了这一点,一开始我很困惑为什么我必须在10中设置hlsl而不是9。现在我明白了。 - numerical25

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接