DirectX怪像之一,我的模型不见了

转载 2015年07月07日 17:03:59

引言

对于刚刚编写DirectX程序的朋友来说,经常遇到的一个问题就是,风风火火写了一大堆代码,编译-运行!哇塞,窗口里黑乎乎一片,啥也没有,或者是之前运行好好的程序,不只修改了哪里,导致以前渲染的画面现在都没有了。我在学习的过程中也经常遇到这种问题,索性总结下来,与大家分享。希望能给刚入门的兄弟们一个提醒。

场景为何消失?

根据我自己的经验,如果渲染场景中某些东西不见了,一般有以下几个主要的原因

光照设置不正确

很简单,在一个伸手不见五指的黑夜里,你能指望看见什么呢?光照是D3D中必不可少的东西,用来计算顶点的最终颜色。但是并不是所有的顶点格式都需要光照,有些定点格式,如果设置了光照反而会导致模型无法显示,比如LT(Lit and Transformed)格式。我们来看看D3D中的光照原理。

  • 如果将光照设置为enable(通过D3DRS_LIGHTING=TRUE设置),那么系统会对所有法向量不为0的顶点进行光照计算,即使输入的顶点中包含颜色信息,也将被丢弃。
  • 如果将光照设置为disable,那么对于LT格式,将使用顶点自带的颜色信息,而对于其他类型的顶点,将没有光照计算,也就无法显示。
  • 创建并开启了depth buffer,但是并没有enable lighting,这个有待确定,目前上不知原因。

所以如果顶点是LT格式的,而且设置了光照为enable,那么模型也是无法显示的,因为LT格式的顶点不包含法向量,没有法向量是无法完成光照计算的。

视图矩阵设置不正确

这个也很简单,在一个阳光明媚的日子,一位绝色美女站在你旁边,可是你却背对着她!如何欣赏到她的美呢?有了光照,有了场景,可是如果场景不在你的视野内,你依然什么都看不见,比如模型绘制在X轴正半轴上,而视线却指向X轴负半轴。所以,正确的设置视图矩阵也是看见场景的重要因素。DirectX使用左手系,Z轴指向屏幕内部的方向为正,一般来说模型都绘制在坐标系的原点,而观察点也设置为原点,眼睛的位置只要设置成Z轴负半轴上的某个位置就可以了。下面就是一个典型的设置代码,也就是说,eyePt的z坐标一般都是负值,如果你一不小心将其设置为正值,那么屏幕上肯定会空无一物的。

D3DXVECTOR3 lookCenter(0.0f0.0f0.0f) ;
D3DXVECTOR3 upVec(
0.0f1.0f0.0f) ;
D3DXVECTOR3 eyePt(
0.0f0.0f-20.0f) ;

剔除方式不正确

D3D默认的剔除方式是逆时针,也就是CULL_CCW,如果你的顶点是按照逆时针顺序定义的,而且使用了默认的剔除方式,那么肯定什么都看不见。所以一定要确保顶点定义的顺序和剔除顺序是相反的,也就是说,如果程序中定义了顺时针剔除,那么你的顶点就应该保持逆时针顺序。在D3D中可以指定如下三种剪裁方式:

D3DCULL_CW  顺时针

D3DCULL_CCW  逆时针

D3DCULL_NONE   不剪裁

如何诊断剪裁问题?

如果你怀疑程序可能是由于剪裁导致了错误,那么可以将剪裁方式指定为D3DCULL_NONE,并按照下面步骤诊断。

  • 问题不存在了,这说明是剔除方式不对,可以分别试试D3DCULL_CW和D3DCULL_CCW这两种方式。
  • 问题依旧,这说明不是剔除的问题,因为D3DCULL_NONE不进行任何剔除操作,所有的面都该显示。应该是其他原因引起的。

转换矩阵设置不正确

比如不小心将模型平移到了视野之外。如果有多个模型,要为每个模型单独设置world matrix,且这些world matrix之间不能互相影响。

启用了ZBuffer却没有清除ZBuffer

如果在创建Device的时候启用了ZBuffer,如下:

d3dpp_.EnableAutoDepthStencil = TRUE ;
d3dpp_.AutoDepthStencilFormat    = D3DFMT_D16 ;

那么在clear render target的时候一定要记得clear ZBuffer,如下:

d3ddevice_->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x4F94CD, 1.0f, 0);

如果是下面这样,那么将什么也看不见。

d3ddevice_->Clear(0, NULL, D3DCLEAR_TARGET, 0x4F94CD, 0.0f, 0);

注意,如果在创建Device的时候像上面那样指定了ZBuffer,那么就不用显示设置开启ZBuffer了。因为D3D会自动设置ZBuffer为开启状态,也就是下面的代码其实是多余的。

d3ddevice_->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

模型颜色与窗口背景色一致

这也算是一个低级错误了,是在StackOverFlow上看到的一个问题,有一哥们将窗口背景设置为白色,输出的模型也是白色,结果,啥也看不见。

没有绘制内容

这个原因听起来很滑稽,不过不可否认的是,我曾多次犯了这个错误,程序中没有绘制任何东西!其实这个问题的原因往往是修改代码造成的,一开始程序的行为是正确的,但是后来为了修改某些功能为Render函数就行修改,可能会无意间注释掉某些内容,如果将绘制的代码注释掉,那肯定就什么也看不见了。

总结

当然,看不见模型的原因远不止这些,本文只是抛砖引玉,欢迎大家补充指正!

DirectX的OBJ模型加载与渲染

使用DirectX9加载并渲染一个OBJ模型,有代码可下载.
  • zxx43
  • zxx43
  • 2015年03月07日 01:14
  • 3216

DirectX3D游戏开发五 简单模型创建(索引缓存)

欢迎来到EasyLiu的博客!     参考:directxtutorial.com     到目前为止我们仅仅创建了一些单个的三角形。我们知道3D模型是由很多三角形连接起来形成一个几何体的。在这节课...
  • liuyi1207164339
  • liuyi1207164339
  • 2015年08月29日 19:27
  • 857

DirectX SDK去哪了?

听说DirectX11出了很多新特性,于是根据经验到网上去找SDK来体验,结果资源并不多,好不容易找到了,竟然安装失败,错误代码“S1023”于是到微软官网上找,好不容易找到了“DXSDK_Mar09...
  • aloneone
  • aloneone
  • 2015年12月26日 21:39
  • 2078

c#开发环境下用Directx载入3D模型

Direcx一般都是用VC++开发环境,而c#相关的资料比较少,最近做的一个项目中需要用到一个3D模型,而开发环境是visual c#,没办法,就四处搜集资料,查找相关的资料,然后找到了几篇相关的博文...
  • t46414704152abc
  • t46414704152abc
  • 2015年05月16日 15:27
  • 5805

DirectX游戏开发之3D角色动起来(上)

DirectX游戏开发之多动作模型的简单使用(一)由于自己本身对DirectX的研究终究是不够深入的,对于顶点缓存,索引缓存,纹理映射这些重中之重的东西,我应该是不具有太过突出的发言权的,写出来也估计...
  • UltramanGaia520
  • UltramanGaia520
  • 2016年08月31日 01:08
  • 774

c#开发环境下用Directx载入3D模型

Direcx一般都是用VC++开发环境,而c#相关的资料比较少,最近做的一个项目中需要用到一个3D模型,而开发环境是visual c#,没办法,就四处搜集资料,查找相关的资料,然后找到了几篇相关的博文...
  • mao0514
  • mao0514
  • 2017年06月29日 10:34
  • 548

【Visual C++】游戏开发笔记四十四 浅墨DirectX教程十二 网格模型和X文件使用面面观

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  文章链接: http://blog.csdn.net/zhmxy555/article/details/8586540作者:毛星云(浅墨...
  • zhmxy555
  • zhmxy555
  • 2013年02月18日 03:31
  • 35411

【Visual C++】游戏开发五十一 浅墨DirectX教程十九 网格模型进阶之路

最近几个星期,不停地收到大家的评论和邮件,大家都说希望浅墨早点讲骨骼动画。本来按浅墨拟定的写作计划是把骨骼动画放到很后面,因为骨骼动画知识需要前面的网格模型知识为基础,知识量本身有些大,很可能要占很多...
  • true11false
  • true11false
  • 2014年07月25日 22:55
  • 1268

浅谈DirectX的模型加载

浅谈DirectX的模型加载 xanxus - 2010年10月3日 - DirectX - 0 Comments 喜欢这篇文章吗?分享给你的朋友吧~  基于DirectX的...
  • linuxheik
  • linuxheik
  • 2015年05月11日 10:39
  • 1807

DirectX 9.0c游戏开发手记之RPG编程自学日志之15: Drawing with DirectX Graphics (用DirectX图形绘图)(第8-9节)

本文由哈利_蜘蛛侠原创,转载请注明出处!有问题请联系2024958085@qq.com           这一次我们继续来讲述Jim Adams 老哥的RPG编程书籍第二版第二章的第8节:Usi...
  • u011873969
  • u011873969
  • 2014年09月25日 02:25
  • 977
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DirectX怪像之一,我的模型不见了
举报原因:
原因补充:

(最多只允许输入30个字)