低级图形编程和ZBrush

时间:2012-05-02 13:14:57

标签: graphics 3d modeling

经过一段时间的3D建模并享受ZBrush无可挑剔的性能和众多功能后,我认为OpenGL练习对我来说是创造类似的东西,只是一个小雕刻工具。果然我完成了它,我无法与ZBrush的表现相提并论当然看到一支经过良好付费的专业人士如何超越一个业余爱好者。目前我只是假设ZBrush是硬加速的,当我发现它不是时,想象我的惊喜,而且它既不使用opengl也不使用direct3d。

这让我想要在较低的水平上学习图形,但我不知道从哪里开始。如何制作图形库以及如何在不使用opengl的情况下访问帧缓冲区。在没有任何预先存在的工具的情况下显示单个像素会有多少麻烦,而且魔术赋予ZBrush这样的性能。

我很感激有关任何问题的任何信息以及涵盖任何这些主题的书籍的推荐。我已经在阅读Michael Abrash的图形编程黑皮书,但它并没有真正解决这些问题,或者我还没有达到这一点。

提前谢谢。

(请不要发布像“只使用opengl”或“学习数学”这样的答案,这似乎是我发布此问题的所有反应,但这些回复都不在主题内)

2 个答案:

答案 0 :(得分:2)

ZBrush在性能方面是虔诚的,但我认为这是因为它是由具有装配专业知识的图像处理专家制作的(它也可能是由于他们所需的大量汇编代码所致)。移植到64位后已近20年了)。它实际上是从没有任何3D雕刻开始的,只是一个2.5D" pixol"画家,你可以在画布上喷射像素,有一些深度和光线到" pixols"。它直到ZB 1.5左右才开始雕刻。即便如此,它给人们留下了深刻的印象,你可以用多快的速度喷洒这些2.5D" pixols"当一个类似大小的画笔只是用Photoshop或Corel Painter绘制平面像素时,会在画布背面附近将帧速率带到口吃。因此,即使在他们处理任何3D之前,他们在性能方面也处于领先地位,并且只是在画布上喷涂像素;这往往需要一些精英微优化魔法。

当你用它雕刻2000万个多边形模型时,关于ZB的一个注意事项是它甚至不使用GPU光栅化。所有光栅化都在CPU中完成。因此,它不会受益于带有大量支持最新GLSL / HLSL版本的VRAM的强大视频卡;所有它需要的是可以将彩色像素绘制到屏幕上的东西。这可能是它与MudBox相比使用如此少的内存的原因之一,因为它不需要将内存使用量增加三倍,例如VBO(这会使系统内存使用量增加一倍,同时还需要数据)存储在GPU上。)

至于你如何开始使用这些东西,IMO让你的脚湿润的好方法是编写自己的光线跟踪器。我不认为ZBrush会使用扫描线光栅化,因为它们会减少渲染像素的次数,因为它们在旋转模型时会减少渲染像素的数量,这种光栅化往往会在成本上非常成比例地增加多边形。这表明他们用于光栅化的任何技术在性能方面更依赖于渲染的像素数而不是渲染的图元(顶点/三角形/线/体素)的数量。光线追踪适合这些特征。另外恕我直言,光线跟踪器实际上比扫描线光栅器更容易编写,因为你不必费心去处理棘手的情况,并且免于过度使用。

一旦你得到一个软件,其中操作的成本与渲染像素的数量成比例,而不是几何的数量,那么你可以抛出一大堆多边形,因为它们一直在做在大约17年前,Siggraph展示了2000万多边形的多边形雕刻,画面柔和。

然而,让光线跟踪器以交互方式更新以响应网格数据是非常困难的,网格数据不仅交互式地被雕刻,而且有时其交互式地改变其拓扑。因此,很可能他们使用的是除了标准BVH或KD-Tree之外的一些数据结构,这在光线追踪中非常流行,而是一种非常适合动态网格的数据结构,这些网格不仅会变形,而且还会改变其拓扑结构。也许他们可以快速地进行体素化和反体素化(或者#14; pixolize"和#34; repixolize")在飞行中快速网格化并将光线直接投射到体素化表示中。考虑到他们的技术最初围绕着这些2.5D像素而言,这将开始变得有意义。深度。

无论如何,我建议开始进行光线追踪,即使它只是让你的脚湿润并让你无法接近ZB的表现(它还是一个如何将3D几何和光照转换为具有吸引力的2D图像的良好开端。您可以在网上找到最少的光线跟踪器示例,只需一百行代码即可完成。构建光线跟踪器的大多数工作都是性能,并且还处理着色器/材料的丰富多样性。你不一定需要打扰后者,ZBrush也不是那么多(他们使用这些便宜的matcaps进行建模)。然后,你可能不得不创新某种非常适合网格变化的数据结构,以便开始与ZB相提并地微调它。该软件真的处于一个完全不同的竞争环境中。

我同样受到了ZB的启发,但是没有直接跟随他们的脚步,而是使用GPU光栅化器和OpenGL。我发现很难探索像ZB一样在CPU上做这些事情的原因之一是因为你失去了如此多的工业研究和革命技术的好处,游戏引擎和NVidia和AMD已经在实时照明模型中提出了这些技术等等都受益于GPU端处理。有99%的3D行业,然后ZBrush在自己的小角落做了别人没做的事情,你需要大量的业余时间,也许需要很多球来放弃其余的该行业并试图追随ZB的脚步。我仍然希望我能找到一些空余时间来探索像ZB这样纯粹的CPU光栅化引擎,因为当你的目标是直接与高分辨率的网格物体进行交互时它们仍然无法比拟。

我最接近ZB的表现是在90年代后期以超过30 FPS的速度在Athlon T-Bird 1.2ghz上使用256MB内存雕刻了200万个多边形网格,这是经过6周的激烈考验在一个非常简单的演示中反复编程和重新审视绘图板,这是一个非常罕见的时间,我的公司给了我很多研发时间来探索ZB正在做什么。尽管如此,即使在那个时间和相同的硬件上使用一半的内存,ZB仍以相同的帧速率处理该几何体的5倍。我甚至无法接近,尽管我最终对Pixologic的程序员有了新的尊重和钦佩。我也不得不坚持让我的公司去做研究。那里的一些人认为ZBrush永远不会成为任何值得注意的东西,只会保持一个可爱的艺术应用。我认为恰恰相反,因为在它获得如此史诗般的追随者之前很久就看到了革命性的东西。

当时许多人认为ZB能够处理如此多的多边形是不切实际的,你可以只绘制凹凸/法线/位移贴图并在纹理中添加所需的任何细节。但那忽略了工作流程方面的事情。当您可以直接使用大量的几何体时,您可以统一应用相同的工具和工作流来选择顶点,多边形,边缘,刷物等。它成为创建如此详细和复杂模型的最直接的方法之后,您可以将细节烘焙到凹凸/法线/位移贴图中,以便在其他可能会呕吐2000万个多边形的引擎中使用。如今,我认为还没有人质疑ZB的实用性。

  

[...]但它并没有真正解决这些问题,或者我只是没有   到了那一点。

作为一个警告,没有人发表任何关于如何实现与ZB相媲美的性能的内容。否则,当涉及雕刻,dynamesh,zspheres等时,会有许多应用程序可以与其性能和功能相媲美,并且它不会如此惊人的特殊。你肯定需要你的R& D的份额来提出任何接近它的东西,但我认为光线追踪是一个好的开始。在那之后,除了大量的微调之外,你可能还需要为算法和数据结构提出一些非常有趣的想法。

我可以充满信心地说:

  1. 他们有一些中心数据结构来加速光栅化,可以非常快速地更新,以响应用户对网格所做的更改(包括拓扑网格)。
  2. 光栅化的成本与渲染的像素数量成比例,而不是3D输入的大小。
  3. 那里有一些微优化技巧,包括直接组装编码(我非常肯定ZB使用汇编编码,因为它们最初要求程序员在它们是时具有汇编和C ++知识在2000年代招聘;我真的想在Pixologic工作,但缺乏必备的装配技能。)
  4. 无论他们使用什么,都会非常清楚内存要求,因为这些模型非常动态。我上次检查时,即使在使用纹理贴图的生产模型中加载时,它们每百万个多边形的使用量也不到100MB。除XSI之外的竞争3D软件可以为相同的数据接收1千兆字节。 XSI使用的内存甚至比带有gigapoly内核的ZB更少,但是不适合操纵这样的数据,减速到爬行(它们可能以一种非常适合静态数据的方式对其进行优化,例如将数据卸载到磁盘甚至使用一些昂贵的压缩形式)。
  5. 如果你真的对探索这个问题感兴趣,我有兴趣看看你能想出什么。也许我们可以换笔记。我的职业生涯中大部分时间都只是想知道ZB正在做什么,或者至少想出一些与我自己能做的事情相媲美的事情。对于我多年来从光线追踪到粒子模拟,流体动力学和视频处理等所解决的所有其他事情,我至少能够提出与之相媲美或超越其性能的演示。比赛,但不是ZBrush。 ZBrush仍然是我身边难以捉摸的荆棘,在那里我无法弄清楚他们如何能够如此高效地完成他们的工作。

    如果你真的想在开始走路之前爬行(我认为光线追踪是一个不错的开始,但如果你想开始更基本的话)那么自然的演变可能首先只关注图像处理:过滤图像,用画笔绘制它们等,以及对基本矢量图形的支持,如微型Photoshop / Illustrator。然后按照你的方式进行光栅化一些基本的3D图元,比如可能只是使用Wu线光栅化和一些基本投影函数渲染的模型的线框。然后按照你的方式光栅化填充三角形,没有任何光照或纹理,此时我认为你会更接近ZBrush专注于光线追踪,而不是使用深度缓冲的扫描线。然而,无论如何,做一点后者可能是一个有用的练习。然后处理渲染点亮的三角形,可能从直接照明开始,只是单个光源,只是根据相对于光源的法线角度计算亮度。然后使用baycentric坐标对纹理三角形进行处理,以确定要渲染的纹素。然后致力于间接照明和多个光源。这应该是大量的功课,让你对光栅化的基本原理有一个相当全面的了解。

    现在一旦你进行了光线追踪,我实际上会推荐一种效率最低的数据结构:octrees,而不是BVH或KD-Tree,主要是因为我相信八叉树可能更接近允许ZB允许什么。在这种情况下,您的瓶颈与渲染具有复杂漫反射材料的最美丽图像以及用于抗锯齿的间接照明和子像素样本无关。它与处理大量几何形状有关,只需要简单的照明和简单的着色器,每个像素一个样本即可随时更改,包括拓扑。在这种情况下,八度似乎比KD树或BVH更适合作为起点。

    现在忽略基本面的一个问题是许多年轻的开发人员已经失去了与屏幕上三角形到像素的连接。因此,如果您不想将此类光栅化和投影视为理所当然,那么您的初始目标是将3D数据投影到2D坐标空间并对其进行栅格化。

答案 1 :(得分:1)

如果你想要一本低级别的书,有帧缓冲器等,请尝试使用Foley,van Dam等人的计算机图形学:原理和实践。它是一种较旧的传统文本,但较新的书籍往往具有更高级别的视图。对于更现代的文本,我还可以推荐Alan Watt的 3D Computer Graphics 。还有很多其他很好的介绍性文章 - 这些只是我个人所熟悉的两个。

上述两本书都没有与OpenGL相关联 - 如果我没记错的话,它们包含了从下到上理解和实现3D图形所需的特定数学和算法。