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

时间:2010-05-18 01:07:04

标签: c++ c directx

在过去一个月左右的时间里,我一直在努力学习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语法是否相同?

3 个答案:

答案 0 :(得分:7)

我想说在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等。

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

FVF被赞成D3DVERTEXELEMENT9(又名Vertex Declarations) - 与D3D10_INPUT_ELEMENT_DESC非常相似 - 不论如何。实际上,DirectX 10中的大多数内容与DirectX 9 中的内容非常相似,而不是固定功能管道

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