在过去一个月左右的时间里,我一直在努力学习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语法是否相同?
答案 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
函数。
系统价值语义:POSITION
,DEPTH
,COLOR
语义的概括和扩展,现在是SV_Position
,SV_Depth
, SV_Target
并添加每个阶段的新语义,例如SV_InstanceID
,SV_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的清理(在关注点分离方面,使得管道的哪个阶段更加清晰等等)。