【发布时间】:2014-01-21 19:59:16
【问题描述】:
我了解(至少在 xna 项目的 .fx 中使用 hlsl)每种技术都可以有多个通道,并且每个通道都与某个设备状态及其顶点和像素着色器功能相关联。现在我的问题是:鉴于技术中的通道是一个接一个地执行的,每个通道是否意味着通过渲染管道的完整通道? 例如,如果我有一个两次通过的技术,那么以下陈述是否正确: 第一遍获取应用程序的数据(VertexBuffer)并通过管道,第二遍获取第一个吐出的数据并再次通过管道。
【问题讨论】:
我了解(至少在 xna 项目的 .fx 中使用 hlsl)每种技术都可以有多个通道,并且每个通道都与某个设备状态及其顶点和像素着色器功能相关联。现在我的问题是:鉴于技术中的通道是一个接一个地执行的,每个通道是否意味着通过渲染管道的完整通道? 例如,如果我有一个两次通过的技术,那么以下陈述是否正确: 第一遍获取应用程序的数据(VertexBuffer)并通过管道,第二遍获取第一个吐出的数据并再次通过管道。
【问题讨论】:
通行证通常是相互独立的。所有通道都将使用相同的输入几何图形(通常由顶点缓冲区定义)。他们对这个几何图形所做的事情可能会有所不同。
例如你可以有两次传球的技术。第一遍以通常的方式绘制对象。第二遍不会绘制对象,而是将法线绘制为小线。结果是法线表示为线的对象。
类似地,多通道可用于范围广泛的效果,例如毛发、发光、光晕……请记住,管道的结果通常是一种颜色。如果您想将此结果用作另一个着色器的输入,则需要重新连接管道(即设置新的输入对象、着色器...)。
【讨论】:
for each pass in technique { apply pass, render object }。这样做比每次都应用不同的着色器更具可读性。此外,这个功能可以封装在一个方法中。