【问题标题】:Pixel shader to project a texture to an arbitary quadrilateral像素着色器将纹理投影到任意四边形
【发布时间】:2011-09-23 17:41:06
【问题描述】:

只需想出一种方法,使用像素着色器,将纹理投影到任意用户定义的四边形。

将接受四边形四个边的坐标:

/// <defaultValue>0,0</defaultValue>
float2 TopLeft : register(c0);

/// <defaultValue>1,0</defaultValue>
float2 TopRight : register(c1);

/// <defaultValue>0,1</defaultValue>
float2 BottomLeft : register(c2);

/// <defaultValue>1,1</defaultValue>
float2 BottomRight : register(c3);

尝试了几种插值算法,但无法正确处理。

有没有你们认为我可以修改以获得所需结果的示例?

【问题讨论】:

    标签: wpf directx hlsl pixel-shader


    【解决方案1】:

    这里的问题是,所有现代 3D 图形硬件都会光栅化三角形,而不是四边形。因此,如果您要求 Direct3D 或 OpenGL 渲染一个四边形,API 会在内部将四边形分成两个三角形。这通常不是问题,因为所有现代渲染都是透视正确的,因此查看者应该无法分辨一个四边形和两个三角形之间的区别 - 插值将是无缝的。

    要求 API 执行此插值的正确方法是将纹理坐标作为每个顶点的数据传递给它,API/硬件将在每个像素上进行插值。然后,您的像素着色器将有权访问此每像素纹理坐标。我假设当您使用术语“投影”时,您的意思是简单地将矩形纹理映射到四边形上,而不是指纹理投影(就像聚光灯将纹理照射到表面上)。

    这里的底线是,将四边形的纹理坐标传递给像素着色器是错误的方法(除非您有特殊原因需要这样做)。

    【讨论】:

    • 这都是真的......但也完全有可能完全避开硬件基于三角形的插值器并在四边形或多边形或更复杂的事物上定义自己的方案,即使您可以将它们的足迹分成三角形并获取每个像素着色器所需的信息(特别是所有其他顶点的位置和值;不仅仅是局部三角形)。当然,与硬件的专用三角插值支持相比,这并不是一种特别有效的处理方式,但这并不意味着它没有应用程序。
    • 发帖人没有具体说明他们是尝试使用硬件插值,还是绕过它。我同意两者都是可能的。我认为需要澄清最初的问题并提供更多细节。
    【解决方案2】:

    有一个nice paper here 描述您的选项(或这个.ppt)。基本上,您需要在四边形上定义一些重心坐标,然后将片段值插入为给定顶点值的 BC 加权和。

    对不起,不知道任何代码;现代面向三角形的硬件缺乏对四边形的直接支持(参见 voidstar69 的回答)意味着它们已经过时了。

    【讨论】:

      猜你喜欢
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多