Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 像素着色器将纹理投影到任意四边形_Wpf_Directx_Hlsl_Pixel Shader - Fatal编程技术网

Wpf 像素着色器将纹理投影到任意四边形

Wpf 像素着色器将纹理投影到任意四边形,wpf,directx,hlsl,pixel-shader,Wpf,Directx,Hlsl,Pixel Shader,只需要找出一种方法,使用像素着色器,将纹理投影到任意用户定义的四边形 将接受四边形四边的坐标: /// <defaultValue>0,0</defaultValue> float2 TopLeft : register(c0); /// <defaultValue>1,0</defaultValue> float2 TopRight : register(c1); /// <defaultValue>0,1</default

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

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

/// <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);
///0,0
浮动2左上:寄存器(c0);
/// 1,0
浮动2右上角:寄存器(c1);
/// 0,1
浮动2左下:寄存器(c2);
/// 1,1
浮动2右下:寄存器(c3);
尝试了两种插值算法,但都做不好

你们认为有什么样的样本我可以修改以得到想要的结果吗?

有一个描述你们的选择(或这个)的例子。基本上,您需要在四边形上定义一些重心坐标,然后将碎片值插值为给定顶点值的BC加权和


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

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

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


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

这都是正确的。。。但也完全有可能完全避开硬件基于三角形的插值器,在四边形或多边形或更复杂的东西上定义自己的方案,即使您可以将它们的足迹分解为三角形,并获得每个像素着色器所需的信息(特别是所有其他顶点的位置和值;而不仅仅是局部三角形)。当然,与硬件的专用三角形插值支持相比,这并不是一种特别有效的方法,但这并不意味着它没有应用程序。海报没有说明他们是在尝试使用硬件插值,还是侧步插值。我同意这两种方法都是可能的。我认为原始问题n需要澄清和提供更多细节的需求需求。