如何在HLSL中渲染到没有插值错误的球体贴图?

时间:2016-08-22 15:05:53

标签: interpolation hlsl perspective

我正在HLSL中学习一些着色器编程,使用MikuMikuDance作为引擎。我无法访问主渲染器的代码,我只限于DX9下的着色器模型3。我正在尝试创建一个将环境渲染到球体贴图的着色器,这对某些人有用,并且作为实验和学习的工具。我的天真方法似乎导致插值问题。此外,似乎某些顶点被不恰当地剪裁,导致多边形未被绘制在边界处。

我以为我会尝试在顶点着色器中反向运行球体地图代码来创建我的渲染:

Pos = mul( Pos, WorldMatrix );
Out.Eye = CameraPosition - Pos.xyz;
Pos = mul(Pos, ViewMatrix);
float far = 300000;
float3 En = normalize(Pos.xyz);
Out.Pos = float4(En.x, En.y, length(Out.Eye)/(far), 1);

这导致了透视问题,特别是对于较大的多边形:

sphere interpolation

这对我有意义;当它应该是球形时,我正在进行线性插值。但是,在Pos上使用无插值,质心和/或没有明显的效果。

有没有办法通过这种不寻常的投影获得正确的视角?我是以完全错误的方式解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

在没有修改渲染管道的情况下,没有实用的方法来应用真正的球形变换。这不是插值问题,而是光栅化和顶点变换问题。正如您所注意到的,关键是球形投影固有地要求直线变得弯曲。如果管道已经使用了某种类型的曲面细分,则可能,但是否则,单独变换顶点永远不会使它们之间的直边变得弯曲。

如果您还能够修改或添加屏幕空间效果(例如后期处理),则可以操纵源纹理坐标以在其中应用球形变换。在这种情况下,修改顶点着色器以增加FOV仍然是有益的,这样您就可以填充更多的半球。这将是FOV和分辨率之间的权衡 - 当你接近180度时,投影前和投影后的分辨率差异会增加。在179度时,初始渲染中的几乎所有像素都将映射到半球的外环。