计算GLSL(OpenGL)中的矢量交叉点

时间:2014-05-10 18:06:05

标签: opengl glsl shader

我想为场景添加雾。但是,不是根据与相机的距离为片段颜色添加雾,而是希望采用更逼真的方法。我想计算距离,从眼睛到片段的矢量通过一层雾“行进”。 enter image description here

对于雾层,我的意思是雾具有下限(z坐标,在这种情况下是向上的)和更高的限制。我想计算从眼睛到片段的矢量,并得到它在雾中的部分。该部分在图形中标记为红色。

计算实际上非常简单。但是,我必须用简单的方法做一些测试(如果那样)。

calculate line from vector and camera position;
get line intersection with lower limit;
get line intersection with higher limit;

do some logic stuff to figure out how to handle the intersections;
calculate deltaZ, based on intersections;          
scale the vector (vector = deltaZ/vector.z)
fogFactor = length(vector);

这应该很容易。然而,麻烦的是我必须添加一些逻辑来弄清楚相机和碎片相对于雾的位置。此外,我必须确保向量实际上与限制相交。 (当矢量z-Value为0时会产生麻烦) 问题是,替换不是着色器的最好朋友,至少这是互联网告诉我的。 ;)

我的第一个问题:有没有更好的方法来解决这个问题? (我实际上想继续使用我的雾模型,因为这是解决问题的方法。)

第二个问题:我认为计算应该从片段着色器而不是顶点着色器完成,因为这不是可以插值的。我是对的吗?

这是该场景的第二个图形。 second graphic

1 个答案:

答案 0 :(得分:1)

问题解决了。 :)

我不是用下限和上限定义雾,而是用中心高度和半径定义雾。因此,下限等于中心减去半径,上限是中心加半径。

有了这个,我想出了这个计算:(抱歉变量名称不好)

// Position_worldspace is the fragment position in world space
// delta 1 and 2 are differences in the  z-axis from the fragment / eye to
// the center height

float delta1 = clamp(position_worldspace.z - fog_centerZ, 
                     -fog_height, fog_height)
float delta2 = clamp(fog_centerZ - cameraPosition_worldspace.z, 
                     -fog_height, fog_height);

float fogFactor z = delta1 + delta2;

vec3 viewVector = position_worldspace - cameraPosition_worldspace;
float fogFactor = length(viewVector * (fogFactorZ / (viewVector ).z));

我想这不是计算这个的最快方法,但它可以解决这个问题。

无论其! 这种效果并不是真正的结果,因为雾的更高和更低的极限是锋利的。我忘记了这一点,因为当眼睛不在这些边界附近时它看起来并不好看。但我认为这个问题有一个简单的解决方案。 :)

感谢您的帮助!