硬件着色器
这些是给硬件着色器插件编程人员的编码提示。
如果不是必需的,不要入栈和弹出所有 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)来恢复显示着色器的默认状态。这将允许插件的用户根据性能要求选择性地关闭着色器显示。