硬件着色器

这些是给硬件着色器插件编程人员的编码提示。

  • 如果不是必需的,不要入栈和弹出所有 GL 属性。这比使特定属性入栈开销更高。

  • 如果仅在场景视图中使用硬件着色器,建议使用旧版本的 API:geometry()、bind() 和 unbind()。如果还要对硬件着色器进行批渲染,建议使用较新的 API:glGeometry、glBind 和 glUnbind。

  • 建议将所有节点属性缓存在内部。示例插件 hwColorPerVertex、hwPhongShader 和 cgFxShader 都可执行此功能。非缓存值的求值开销很高,可能双倍延长绘图时间。

  • 避免使用复杂的属性(结构和数组)。

  • 如果着色器上的输出颜色并不重要,不要让任何属性影响它。否则,将导致额外的计算,因为将一个属性标记为脏会导致重新计算以派生从属属性。

  • 如果不是必需的,compute() 方法可以保留为空。该方法越简单越好。如果不计算输出颜色,将不会看到“Hypershade”样例。                

  • 不要在插件中对切线进行后期规格化。规格化由系统完成。

  • 通过几何体调用发送的数据是只读的且缓存在内部。请勿修改这些值。

  • 针对简单数据使用简单数据结构(而不是 Maya API 对象)。例如,使用 float3 而不是 MFloatVector。OpenMaya 中使用的接口导致性能开销。

  • 利用 M3dView 上的可用方法。OpenGL 状态在内部进行缓存,与使用 beginGL()、endGL() 和直接调用 OpenGL 相比可以提供更好的性能。

  • 使用 glDrawRangeElements 来绘图。显卡供应商建议使用此 API 来进行传递到硬件着色器的几何体阵列的绘图。

  • 确保正确设定 hasTransparency() 的返回值。将其设定为 true 会导致 Maya 绘制某个对象两次(一次在消隐正面时,一次在消隐背面时)。

  • 考虑在 M3dView 中的当前显示状态。例如,如果显示模式是“不使用灯光”(Use No Lights)就不要禁用照明。                

  • 当透明度为启用时,帧缓冲区混合已启用。不必再次启用。

  • 使用方法 MPxHwShaderNode::currentPath() 发送属性查询方法(例如,getTexCoordSetNames())的相应信息。

  • 测试对于交互式和特别是对于硬件渲染,在颜色/Alpha 和深度遮罩上的哪些参数是启用的。它们可以为如何绘制更简单的几何体给出提示。

  • 对于硬件渲染器,插件可以多次调用。常规序列通常是:深度过程、[照明过程[es]]、颜色过程、[阴影贴图过程]、[Alpha 过程]、[深度过程]。标记了方括号“[”和“]”的项目是可选项目并且依赖于场景中的灯光数量、是否已启用那些灯光的阴影以及在“渲染设置”中是否指定alpha 和深度输出图像。                

  • 使用“忽略硬件着色器”(Ignore Hardware Shader)选项,该选项可用于每对象(NURBS 或多边形曲面)。该选项可以在“对象显示”(Object Display)部分的“属性编辑器”(Attribute Editor)中找到,并作为“显示 > 对象显示”(Display > Object Display)菜单的选项。使用“忽略硬件着色器”(Ignore Hardware Shader)让硬件着色器不显示在对象上,或使用“使用硬件着色器”(Use Hardware Shader)来恢复显示着色器的默认状态。这将允许插件的用户根据性能要求选择性地关闭着色器显示。                

,