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

标签 wpf directx hlsl pixel-shader

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

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

/// <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);

尝试了几种插值算法,但无法做到正确。

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

最佳答案

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

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

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

关于wpf - 像素着色器将纹理投影到任意四边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7532867/

相关文章:

c# - 根据名称以编程方式设置 EXAM Datagrid 的选定项目

graphics - 从 Unity3D 到 DirectX 的投影矩阵

directx - 如何从 Direct3d11 中的顶点缓冲区读取顶点

silverlight - 我如何为 Silverlight 编写 HLSL 斜角着色器?

unity3d - hlsl CG 计算着色器竞争条件

arrays - Texture2D 数组作为 HLSL 像素着色器中的渲染目标

c# - 如何针对一组可变的值范围进行验证?

c# - 设计具有可扩展 TextBlock 的 WPF 控件

wpf - "group"项目 "virtually"的最佳方法?

opengl - 多头显示系统