如何为3D渲染编写“材料模块”?

时间:2009-09-28 11:19:59

标签: 3d rendering

在某些时候,我想为我的3D渲染引擎编写一些类型的动态材质处理模块。它应该是便携式的(GL,D3D等)。当我说“动态”时,我的意思是一个能够加载材料定义和数据运行时的模块(通过我的资源管理模块)。

材质模块应该处理基本图元:纹理,法线贴图,片段着色器等等。

我该如何开始?试验和错误肯定会导致两个或三个完全没用的原型,我宁愿跳过。你能指点我一些好的,甚至很棒的设计/实施/教程/文章,可以帮助我完成任务吗?

2 个答案:

答案 0 :(得分:4)

我首先看一下免费提供的Blender code.

另外,请看一下这本书:3d Computer Graphics

我发现它对解释基本原理非常有帮助

答案 1 :(得分:3)

这是一个非常重要的话题;建立一个高效的材料系统是很难开始的,但补充一点,你希望它是可移植的和动态的,它实际上并没有那么复杂。

要看的地方(Google会找到所有这些):

  • 游戏编程宝石书籍
  • 图形编程宝石书籍
  • ShaderX书籍
  • GameDev-Algorithms邮件列表是一个很好的资源,也是SWEng-GameDev列表
  • 看看其他API做了什么;例如Ogre3D或Unity。

建议:

  • 将D3D10处理状态视为不可变状态块;这很好,因为它适合3D硬件
  • 将物质状态和物质数据视为单独的事物;状态是像alpha混合类型的东西,而数据是漫反射颜色或纹理之类的东西。状态是不可变的,是排序渲染过程的基础,而数据是动态的,可以按渲染对象设置/更改
  • 我找不到着色器的任何好解决方案。除非你想在没有任何GL驱动程序的Windows上支持英特尔硬件,否则GLSL非常棒。 HLSL仅限DirectX。 Cg无法为我运行多线程。如果您的情况相同,唯一的选择是提供特定的着色器配置文件(例如'HLSL Vertex Shader 3.0')并让开发人员应对这些差异,或以某种方式将其全部抽象出来,这是更多的工作,可能不那么灵活
  • 让它变得动态只是一个正确跟踪引用的问题。困难部分是不太明显的情况,比如如果你更改渲染网格的材质,它可能需要不同的顶点格式,所以你将不得不更新网格的顶点缓冲区