【问题标题】:Drawing multiple objects绘制多个对象
【发布时间】:2012-11-01 16:56:13
【问题描述】:

我学习 DirectX 已经有一段时间了,我已经到了从 .obj 文件将多个对象绘制到屏幕上的地步。我的问题是,如果我绘制 2 个对象,则第 2 次绘制将在第 1 次之上。

示例:
Obj1 = 纸板箱
Obj2 = 立方体

loadStuff_&_draw(Obj1);  
loadStuff_&_draw(Obj2);

这会将立方体绘制在盒子外面/前面,即使它在盒子里面/后面。

如何让多个对象绘制在一起以使它们正确重叠?

我所知道的唯一绘画内容是:

  • 加载顶点、索引、常量缓冲区
  • updateSubresource()
  • drawIndexed()

编辑:
这是一个盒子里的立方体的图片。它显示立方体在盒子后面而不是里面。它还显示盒子的边缘夹在盒子后面。不知道发生了什么。

我画了立方体,然后画了空心盒子。

【问题讨论】:

  • 您是否已经创建了深度缓冲区和深度模板状态?
  • 我有一个,但我真的不知道怎么用。
  • 您使用的是哪个版本的 DirectX?

标签: c++ directx directx-11


【解决方案1】:

这就是深度缓冲区(有时称为 z 缓冲区)的用途。当您在绘制一个对象期间写入一个像素时,它会记录深度缓冲区中该像素与视点的距离。然后,当您绘制也将写入该像素的第二个对象时,它可以将该像素处新对象的深度值与缓冲值(来自先前对象)进行比较,并且仅当新值比旧值更接近时才会覆盖该像素一。如果像素被绘制,则更新深度值以反映更接近的值。

一些链接可能会给你一些关于如何实现它的想法:

http://msdn.microsoft.com/en-gb/library/windows/desktop/bb205074%28v=vs.85%29.aspx

http://www.rastertek.com/dx11tut35.html

https://stackoverflow.com/a/8641210/28875

【讨论】:

  • 天啊,所以深度模板有用吗?我以为这只是为了掩盖像素……等等,这就是我想要做的!所以在查看了我的代码后,我发现我的模板无效。感谢您的资源。
  • 模板缓冲区和深度缓冲区是不同的概念(尽管它们的工作方式相似)。
【解决方案2】:

这取决于你如何设置物体的世界矩阵,如果你想第二个物体在第一个物体之后,那么在绘制之前设置正确的世界矩阵。假设对象 1 位于原点 (0, 0, 0),那么您可以将对象 2 转换为 (0, 0, -10) 以使其位于对象 1 后面。并转换为 (0, 0, 10) 将使其位于 object1 的前面。

【讨论】:

  • 这不是问题。最后绘制任何对象将始终将其绘制在前面,无论它在世界的哪个位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多