代码之家  ›  专栏  ›  技术社区  ›  Jonas Byström

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

  •  4
  • Jonas Byström  · 技术社区  · 16 年前

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

    材质模块应该处理基本的原语:纹理、法线贴图、片段着色等等。

    我该怎么开始?尝试和错误肯定会导致两到三个完全没有价值的原型,我宁愿跳过。你能给我指出一些很好的,甚至很好的,设计/实现/教程/文章来帮助我完成任务吗?

    2 回复  |  直到 16 年前
        1
  •  3
  •   sdclibbery    16 年前

    这是一个非常大的主题;构建一个高效的材料系统是很难开始的,但是加上你希望它是可移植的和动态的,并且它不会变得比这复杂得多。

    要查找的位置(Google将找到所有这些位置):

    • 游戏编程宝石书
    • 图形编程宝石书
    • shaderx书籍
    • gamedev算法邮件列表是一个很好的资源,也是sweng gamedev列表
    • 看看其他API的作用,例如ogre3D或Unity。

    忠告:

    • 看一下d3d10将状态作为不变状态块处理的方法;这很好,因为它适合3D硬件
    • 将材质状态和材质数据视为单独的事物;状态是类似alpha混合类型的事物,而数据是类似漫反射颜色或纹理的事物。状态是不可变的,它是对渲染过程进行排序的基础,而数据是动态的,可以根据渲染对象进行设置/更改。
    • 我找不到任何好的阴影解决方案。glsl非常好,除非你想在没有任何gl驱动程序的Windows上支持Intel硬件。HLSL仅为DirectX。CG不能运行多线程。如果您的情况相同,唯一的选择是提供特定的明暗器配置文件(例如“hlsl vertex shader 3.0”),并让开发人员处理这些差异,或者以某种方式将其抽象,这样做更有效,也可能不太灵活。
    • 使其动态化只是正确跟踪引用等的问题。较难的部分是不太明显的情况,例如,如果更改网格正在渲染的材质,则可能需要不同的顶点格式,因此必须更新网格的顶点缓冲区。
        2
  •  4
  •   nont    16 年前

    我先看看免费的 Blender code.

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

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