在过去一个月左右的时间里,我一直在努力学习DirectX.所以我一直在DirectX 9和10之间来回混音.我在两者中看到的一个主要变化是如何在图形卡中处理矢量.
我注意到的一个重大变化是你如何让GPU识别你的结构.在DirectX 9中,您可以定义灵活顶点格式.
您的典型设置如下:
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
Run Code Online (Sandbox Code Playgroud)
在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}
};
Run Code Online (Sandbox Code Playgroud)
我在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函数以随机访问方式进行过滤的数据.
系统值语义:泛化和扩展的POSITION,DEPTH,COLOR语义,也就是说现在是SV_Position,SV_Depth,SV_Target并增加每级新的语义一样的SV_InstanceID,SV_VertexId等等.
这就是我现在所看到的一切.如果有什么新东西突然出现,我会更新我的答案.
FVF(在某种程度上)已被弃用,取而代之的是D3DVERTEXELEMENT9(又名顶点声明)——无论如何,它非常相似D3D10_INPUT_ELEMENT_DESC。事实上,DirectX 10 中的大部分内容与 DirectX 9 中减去固定功能管道的内容非常相似。
DirectX9 和 DirectX10 之间最大的变化是 API 的清理(在关注点分离方面,使得更清楚什么与管道的哪个阶段相关,等等)。
| 归档时间: |
|
| 查看次数: |
3362 次 |
| 最近记录: |