我正在制作一个以太空为背景的 3D 游戏。我目前正在添加行星的轨道线。
理想情况下,我想以 1 像素宽度绘制轨道线,而不管线与相机的距离如何。有谁知道这样做的方法?
目前,我正在使用缩放和旋转以匹配行星轨道的平面网格。在片段着色器中,我使用 U 和 V 坐标来确定是否应在给定像素处绘制像素:
// subtract 0.5 from UV coordintes of this pixel
"sub ft0, v1, fc4 \n" + // fc4 is a vector of 0.5 values
// double it, so values range from -1...1
"mul ft0, ft0, fc2 \n" + // fc2 is a vector of 2 values
// square x component
"mul ft1.x, ft0.x, ft0,x \n" +
// square y component
"mul ft1.y, ft0.y, ft0.y \n" +
// set others to 0
"mov ft1.w, fc0.w \n" + // fc0 is a vector of 0s
"mov ft1.z, fc0.w \n" +
// add and square root to get distance from centre...
"add ft1.xyzw, ft1.xxxx, ft1.yyyy \n" +
"sqt ft1, ft1 \n" +
所以 ft1 最终是当前片段与平面网格中心的距离。我可以使用 sge 和 slt 操作代码将此值与“1”进行比较,但是如何使结果线始终仅绘制 1 个像素宽度?我得到的结果会因透视而失真,并且如果相机接近与飞机齐平。
我已经尝试通过当前片段与相机的距离来缩放宽度,但这似乎是一个丑陋的解决方法 - 如果相机恰好与轨道平面齐平,它仍然会受到“扁平化”的影响。
解决方案是什么?当然可以绘制一条非透视的 1 像素宽度的线......