【问题标题】:How to modify/displace pixel position in a Cg fragment shader?如何修改/置换 Cg 片段着色器中的像素位置?
【发布时间】:2011-12-28 17:17:47
【问题描述】:

是否可以使用 Cg 修改片段(像素)着色器中的像素坐标?我确信这样的功能在第 2 代/第 3​​ 代着色器中可用,但我不知道具体是什么配置文件,或者如何做到这一点。

【问题讨论】:

    标签: shader pixel-shader fragment-shader cg


    【解决方案1】:

    不,这是不可能的。

    您可以在片段着色器中修改的唯一坐标是 Z,进入 Z 缓冲区。即使这样也会对性能产生影响,因为它会破坏一些优化(如分层 Z)。

    X 和 Y 位置在片段着色器执行之前设置(在 Rasterizer 中)。典型的光栅化器实际上至少生成 2x2 的像素块,而硬件并没有真正单独处理像素,一直到混合阶段。

    有些人倾向于模仿这种类型的特征是生成比必要更多的像素,并丢弃无关的像素。

    您听说过的功能可能是曲面细分。它不是作为片段着色器的一部分完成的,而是管道的一个单独部分,允许生成额外的几何体。

    最终,您可以使用什么技术取决于您要达到的目标。但是各种 API 从未支持对 X 和 Y 进行全面修改,无论是在 Cg、OpenGL 还是 DirectX 中,因为硬件无法做到这一点。

    【讨论】:

    • 好的,我该如何修改 CG 中的 z?我猜位移是正确的术语......我如何传递 z 位置并改变它?
    • 您可以通过 DEPTH 语义(输入为 float)更改 Z。 Cg 规范在上面说:“[,,,] 默认值是从光栅化器获得的插值深度。从语义上讲,这个默认值在片段程序执行开始时被复制到输出中。”
    【解决方案2】:

    您无法实时修改位图的实际像素,但您可以置换 U/V 坐标映射,从而改变每个像素的映射点。

    将 UV 映射想象为红色和绿色渐变。红色代表 X 位置映射,而绿色是 Y 位置映射。如果您将这些坐标乘以柏林噪声,则映射会发生偏移,因此像素也会发生偏移。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多