【发布时间】:2011-12-28 17:17:47
【问题描述】:
是否可以使用 Cg 修改片段(像素)着色器中的像素坐标?我确信这样的功能在第 2 代/第 3 代着色器中可用,但我不知道具体是什么配置文件,或者如何做到这一点。
【问题讨论】:
标签: shader pixel-shader fragment-shader cg
是否可以使用 Cg 修改片段(像素)着色器中的像素坐标?我确信这样的功能在第 2 代/第 3 代着色器中可用,但我不知道具体是什么配置文件,或者如何做到这一点。
【问题讨论】:
标签: shader pixel-shader fragment-shader cg
不,这是不可能的。
您可以在片段着色器中修改的唯一坐标是 Z,进入 Z 缓冲区。即使这样也会对性能产生影响,因为它会破坏一些优化(如分层 Z)。
X 和 Y 位置在片段着色器执行之前设置(在 Rasterizer 中)。典型的光栅化器实际上至少生成 2x2 的像素块,而硬件并没有真正单独处理像素,一直到混合阶段。
有些人倾向于模仿这种类型的特征是生成比必要更多的像素,并丢弃无关的像素。
您听说过的功能可能是曲面细分。它不是作为片段着色器的一部分完成的,而是管道的一个单独部分,允许生成额外的几何体。
最终,您可以使用什么技术取决于您要达到的目标。但是各种 API 从未支持对 X 和 Y 进行全面修改,无论是在 Cg、OpenGL 还是 DirectX 中,因为硬件无法做到这一点。
【讨论】:
您无法实时修改位图的实际像素,但您可以置换 U/V 坐标映射,从而改变每个像素的映射点。
将 UV 映射想象为红色和绿色渐变。红色代表 X 位置映射,而绿色是 Y 位置映射。如果您将这些坐标乘以柏林噪声,则映射会发生偏移,因此像素也会发生偏移。
【讨论】: