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

时间:2013-07-09 20:14:05

标签: opengl glsl shader interpolation

我刚开始工作(看起来效果非常快)Ray Casting系统可以制作基本照明(这里有一些像demoes一样的工作:http://www.redblobgames.com/articles/visibility/)。它的工作方式与我想要的一样,但是当我为玩家/光源的点亮区域距离的每个顶点设置时,它的内插非常糟糕,例如,如果我想将光线/阴影修剪为距离的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;
}

这段代码应该给我一个很好的FOV裁剪圆圈,但我会得到类似的东西: It's clearly not a circle-like shape

我不确定它为什么会起作用......

1 个答案:

答案 0 :(得分:0)

这不是准确性问题,即算法,很容易看出是否采用了所有边相等的三角形并将对象放在其中一个顶点上。在其他两个顶点中,您将获得相同的距离,并且沿着这两个远点之间的边缘将获得相同的距离,这是错误的,因为它应该在该边缘的中心更大。

如果您在光源处使用角度较小的三角形,则可以平滑。

更新:如果您为每个三角形传递光线位置,您仍然可以获得圆形阴影,并使用插值坐标计算片段着色器中的实际距离。