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

在过去一个月左右的时间里,我一直在努力学习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和DX10(以及扩展DX11)之间的HLSL语法本身没有根本的变化。

正如codeka所说,变化更多的是清理API和走向泛化的道路(为了GPGPU)。 但确实有明显的差异:

明显的差异:

  • 要将常量传递给着色器,您现在必须通过Constant Buffers。

  • 共同着色器核心:所有类型的着色器都可以访问同一组内部函数(有一些例外,如GS阶段)。 整数和按位运算现在完全符合IEEE标准(并且不通过浮点模拟)。 您现在可以访问二进制强制转换,将int解释为float,将float解释为uint等。

  • 纹理和采样器已经分离。 您现在使用语法g_myTexture.Sample( g_mySampler, texCoord )而不是tex2D( g_mySampledTexture, texCoord )

  • 缓冲区:一种新的资源,用于访问不需要以随机访问方式进行过滤的数据,使用新的Object.Load函数。

  • 系统值语义: POSITIONDEPTHCOLOR语义的泛化和扩展,现在是SV_PositionSV_DepthSV_Target和每级新语义的添加,如SV_InstanceIDSV_VertexId等。

这就是我现在所看到的一切。 如果有什么新东西突然出现,我会更新我的答案。

我在DX9和DX10之间注意到的最大变化是,在DX10下你需要设置一个整个渲染块,在DX9中你可以改变各个状态。 这有点破坏了我的架构,因为我更依赖于能够进行一些小改动并使所有其他状态保持不变(当你从着色器设置状态时,这只会成为一个问题)。

另一个重大变化是DX10顶点声明与编译着色器(在CreateInputLayout中)相关联。 在DX9下,情况并非如此。 您只需设置声明并设置着色器。 在DX10下,您需要创建着色器,然后创建附加到给定着色器的输入布局。

正如codeka所指出的那样,D3DVERTEXELEMENT9一直是推出着色器签名的方法,因为引入了DX9。 FVF已经折旧,通过FVF,您无法执行设置切线基础的操作。 顶点表示function远远强大,不会让您固定到布局。 您可以将顶点元素放在任何您喜欢的位置。

如果您想了解有关DX9输入布局的更多信息,那么我建议您从MSDN开始。

FVF(有点)不赞成D3DVERTEXELEMENT9 (又名顶点声明 ) – 它与D3D10_INPUT_ELEMENT_DESC非常相似 – 无论如何。 实际上,DirectX 10中的大多数内容与DirectX 9中的内容非常相似,而不是固定function管道

DirectX9和DirectX10之间的最大变化是API的清理(在关注点的分离方面,使得管道的哪个阶段更加清晰等等)。