D3D总结(针对自己的学习)

1.D3D默认启用灯光,关闭镜面反射。

2.如果未关闭灯光,但是没有设置灯光和材质,绘制的所有东西都为全黑的(包括纹理贴图和物体),因为此时没有设置灯光和纹理。

3.如果未关闭灯光,但是有设置灯光没有设置材质,绘制的所有东西全黑的,因为D3D默认设置全黑色材质。

4.如果未关闭灯光,有设置灯光和材质,但是未设置顶点法向量,则只有灯光和材质中的环境光有作用(由环境光决定物体的颜色)。

5.如果启用灯光,但是关掉灯光,则所有的物体绘制为全黑。

6.如果场景中没有涉及到灯光,就一定要调用Device->SetRenderState(D3DRS_LIGHTING, false);关闭灯光。

7.如果关闭灯光,但是没有设置顶点颜色,则所有顶点默认为白色(如果指定顶点格式为:D3DFVF_XYZRHW,则灯光不起作用,作用相当于关闭灯光)。

8.默认获取纹理颜色的状态为:

g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);

g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);

为纹理和漫反射的混合(如果有开启灯光,则漫反射首先从灯光和材质获取,如果禁用灯光,则从顶点获取)。

如果只想获取纹理的颜色,则改变获取颜色的状态(如果没有设置纹理,则从漫反射中获取):

g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);

g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);

g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);

如果只想获取蛮反射颜色,则改变获取颜色的状态:

g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);

g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);

g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);

如果在程序中有纹理渲染,又有漫反射颜色渲染:

当只渲染纹理时,注意将颜色获取状态改成从纹理获取。

当只渲染漫反射时,注意将颜色获取状态改成从漫反射获取,或者调用g_pd3dDevice->SetTexture(0, 0);将纹理改为NULL。

 

9.纹理创建在显卡,如果不指定D3DUSAGE_DYNAMIC,不能调用LockRect.

10.调用CreateOffscreenPlainSurface创建的离屏表面,总是能被LockRect.

11.只有显卡显存才能创建D3DUSAGE_RENDERTARGET标志的。

12.D3D9渲染的面积越大,性能越低。

13.D3D9不支持多线程渲染,可以一个线程渲染,一个线程Lock纹理数据,但是这样性能底下,建议全部放到主线程当中。

14.D3D9 渲染多窗口被认为在一个渲染过程当中,例如:如果我创建了一个Device到刷新率为60的显示器上面,那么我在渲染线程里面渲染1个窗口和渲染多个窗口FPS都为60.(初步推断如D3D9 如果发现有相同的窗口重新开始渲染了,则上一次渲染过程结束了)

15.D3D9 渲染的时候如果打开深度缓冲,则创建Device对象的BackBuffer的宽高必须比交换链中的BackBuffer 的宽高大。否则图像显示不出来。如果不启用深度缓冲,则创建Device的时候可以直接指定BackBuffer 的宽和高为0.

16.D3D9 渲染的时候深度缓冲主要的作用是判断物体的遮挡关系,如果有物体被遮挡了,则不显示出遮挡部分。如果不启用深度缓冲,则物体是否可见和物体的绘制顺序有关系。

17.下面3个函数调用控制颜色值的来源。

g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, ......);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, ......);

g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, ......);

下面3个函数调用控制alpha值得来源。

g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, ......);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, ......);

g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, ......);

18.在启用深度缓冲测试的情况下,两个IDirect3DSwapChain9共用最开始device创建的一个深度模板缓冲区。如果有一个窗口的backbuf大小大于最开始的深度缓冲区,则渲染不出来任何图像。

19.GetRenderTargetData函数不耗时,所有的耗时都在Lock这个目标纹理时。如果这两个函数在多个线程执行,则在创建Device时一定要指定多线程标志。

20.在开启和显卡同步的模式下,如果有一帧直接Sleep。然后在下一帧调用BeginScene、EndPresent、Present时,不会等到下一帧的显卡同步信号,Present就会直接返回。

21.d3d9中开启垂直同步使用D3DPRESENT_INTERVAL_ONE比D3DPRESENT_INTERVAL_DEFAULT好。使用D3DPRESENT_INTERVAL_DEFAULT可能会出现抖动。(D3DPRESENT_INTERVAL_DEFAULT uses the default system timer resolution whereas the D3DPRESENT_INTERVAL_ONE calls timeBeginPeriod to enhance system timer resolution. This improves the quality of vertical sync, but consumes slightly more processing time. Both parameters attempt to synchronize vertically.)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值