今天做完了光照提交,被法线问题狠狠地纠结了两个小时。现在想来,自己真是很2.
材质系统雏形算是有了,支持FPP和SHADER、材质动画、XML加载。算下来,这系统也做得够久了,把所有时间算起来,估计也有6人*月的样子。
反复修改好几次,这次算是在使用上有点长进。其间也收集了不少值得注意的问题。 这些问题在OGRE,Torque等源码里都有所注释,感觉开源代码最大的好处就是注释完整。比许多家酿的东西要好。(至少好认。。。)
随笔记录的一些注意事项,贴在此处以备忘
在D3D和SM1中.常量总是会被打包成4元素大小.
因此. 在SM1中.我们只能使用INT4或FLOAT4的设置方式.
在HLSL中.如果使用了结构体.则结构体会进行对齐操作.就像
VS中的#pragma pack 4一样.
GPU中的常量总是保持在最后一次SetXXConstantsX时的值.但D3D8例外.若D3D8程序中使用了DEF定义常量.则依然保持DEF值.因而会造成不可预测的值出现.
将常量打包,然后用SetXXConstantX方式提交数据. 即减少API CALLS次数.理论上会提高程序效率.GAME DEV.NET上一老外的程序提升45%左右. 而具体情况待测.
DX8的SHADER在设备丢失后,必须重建.因此需保存其MicroCode以使重建时更快.而DX9的却不需要.
"When rendering using vertex shaders, each stage's texture coordinate index must be set to its default value." DX9 as followed.
for (unsigned int nStage=0; nStage < 8; ++nStage)
__SetTextureStageState(nStage, D3DTSS_TEXCOORDINDEX, nStage);
Something about the color_op and alpha_op must be kept IN MIND.
Disables output from this texture stage and all stages with a higher index. To disable texture mapping, set this as the color operation for the first texture stage (stage 0). Alpha operations cannot be disabled when color operations are enabled. Setting the alpha operation to D3DTOP_DISABLE when color
blending is enabled causes undefined behavior
当可编程管线启用时,Stage:0 D3DRS_TRANSFORMFLAGS 必须为0.
对于FFP来说,如果纹理为空,则仅绘制当前模型。对于VS和PS来说,如果需要纹理,但纹理为空,则什么都不做。
世界矩阵和观察矩阵会对法线进行转换,导致法线长度产生变化,(特别是矩阵带有缩放的情况)。从而会引起光照计算不正确。 D3DRS_NORMALIZENORMALS == TRUE 可以解决这个问题,但开销是巨大的。 因此尽量避免使用,以及不要对模型进行缩放变换。可编程管线可无视此标志。
本来说插个图的,可惜这机器上没装客户端,插图很不便。省了。。。。