OpenGL GLSL在基本闪电(2D)中的距离插值精度差

OpenGL GLSL在基本闪电(2D)中的距离插值精度差,opengl,glsl,shader,interpolation,Opengl,Glsl,Shader,Interpolation,我刚刚开始工作,它似乎可以很快地工作光线投射系统,使基本照明像演示一样工作。它的工作原理和我想的一样,但当我为每个顶点设置从播放器/光源到照亮区域的距离时,它的插值效果非常差。例如,如果我想在距离上将灯光/阴影修剪到X,我得到的不是圆,而是介于圆和多边形/正方形之间的东西。图片应该解释一下 此外,如果有必要的话,我会用它来制作带有自顶向下摄像头的3D项目游戏。见下图。该算法在不处理着色器本身的情况下非常有效,但在其上绘制普通空间。没有剪辑等 这是我的顶点着色器: #version 330 cor

我刚刚开始工作,它似乎可以很快地工作光线投射系统,使基本照明像演示一样工作。它的工作原理和我想的一样,但当我为每个顶点设置从播放器/光源到照亮区域的距离时,它的插值效果非常差。例如,如果我想在距离上将灯光/阴影修剪到X,我得到的不是圆,而是介于圆和多边形/正方形之间的东西。图片应该解释一下

此外,如果有必要的话,我会用它来制作带有自顶向下摄像头的3D项目游戏。见下图。该算法在不处理着色器本身的情况下非常有效,但在其上绘制普通空间。没有剪辑等

这是我的顶点着色器:

#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace; //vertex's position
layout(location = 1) in vec3 Normal; //normal, currently not used, but added for future
layout(location = 2) in vec2 vertexUV; //texture coords, used and works ok

out vec2 UV; //here i send tex coords
out float intensity; //and this is distance from light source to current vertex (its meant to be interpolated to FS)

uniform mat4 MVP; //mvp matrix
uniform vec2 light_pos; //light-source's position in 2d

void main(){
    gl_Position =  MVP * vec4(vertexPosition_modelspace,1);
    UV = vertexUV;
    intensity = distance(light_pos, vertexPosition_modelspace.xz); //distance between two vectors
}
这是我的片段着色器:

#version 330 core

in vec2 UV; //tex coords
in float intensity; //distance from light source
out vec4 color; //output
uniform sampler2D myTextureSampler; //texture
uniform float Opacity; //opacity of layer, used and works as expected (though to be change in near future)

void main() {
    color = texture( myTextureSampler, UV );
    color.rgba = vec4(0.0, 0.0, 0.0, 0.5);
    if(intensity > 5)
        color.a = 0;
    else
        color.a = 0.5;
}
这段代码应该会给我一个很好的视场,但我得到的是这样的结果:


我不知道它为什么会这样工作…

这不是一个精度问题,这是算法,很容易看出,如果你拿一个所有边都相等的三角形,把物体放在其中一个顶点上。在其他两个顶点中,您将获得相同的距离,并且沿着这两个距离点之间的边,您将获得相同的距离,这是错误的,因为该边中心的距离应该更大

如果要在光源处使用角度较小的三角形,则可以平滑此操作


更新:如果通过每个三角形的灯光位置,并在片段着色器中使用插值坐标计算实际距离,仍然可以得到圆形阴影。

另外,不要介意纹理和模型,这只是我处理其他更重要的东西的时间。当我处理完更紧迫的事情后,我会把它填上,我希望在我处理这类事情时,一些朋友会帮助我;我们在图片中看到了什么?灰色alpha覆盖是一个新多边形还是背景的相同顶点,只是被着色器变暗了?如果它是一个新的多边形,我想它是,可能你的阈值5太大了。如果我在片段着色器中按距离剪裁,我会得到标准值。我只是简单地使用光线投射从3D空间获取2D空间中的点,我不关心这里的OY,我可以从中创建多边形,或者使用三角形扇形,从这个注释中可以看到图片中的颜色更深。如果我只为这个较暗的多边形使用特殊的着色器,并为它提供光源/播放器的位置,我想让那个较暗的效果慢慢淡出,从而计算方向。不幸的是,正如主贴上的图片所示,它看起来插值效果不太好。我现在明白了。但你根本不是在插值。你正确地插值了强度,但你根本没有插值alpha:你的if语句说你的alpha是0或0.5,而不是介于两者之间。如果你想让它褪色,你需要颜色。a是强度的函数,类似于颜色。a=1-强度/100这是一个不好的函数,但只是一个例子。如果你慢慢褪色,你可以使它看起来几乎像一个圆,但它永远不会是一个圆,除非你在多边形的顶部使用纹理贴图,我认为这是你现在最好的选择。只需制作一个alpha纹理,使一个圆从暗变亮,并给出多边形坐标以对齐该圆。