Opengl 世界空间中的自定义点光源(LWJGL/GLSL)

Opengl 世界空间中的自定义点光源(LWJGL/GLSL),opengl,glsl,lwjgl,lighting,Opengl,Glsl,Lwjgl,Lighting,我正在尝试在世界空间中实现自定义灯光(我知道,建议在视图空间中实现,但我有自己的理由),在我正在编程的一个小游戏中使用LWJGL和GLSL。为此,我需要着色器中世界空间中的顶点位置。我知道,我可以在顶点着色器中将它们计算为modelMatrix*gl_顶点。由于modelMatrix在着色器中不可访问,因此我通过将ModelViewMatrix与viewMatrix的倒数相乘来计算它 顶点着色器代码: uniform mat4 inverseViewMatrix; varying vec3 no

我正在尝试在世界空间中实现自定义灯光(我知道,建议在视图空间中实现,但我有自己的理由),在我正在编程的一个小游戏中使用LWJGL和GLSL。为此,我需要着色器中世界空间中的顶点位置。我知道,我可以在顶点着色器中将它们计算为modelMatrix*gl_顶点。由于modelMatrix在着色器中不可访问,因此我通过将ModelViewMatrix与viewMatrix的倒数相乘来计算它

顶点着色器代码:

uniform mat4 inverseViewMatrix;
varying vec3 normal;
varying vec3 worldCoord;

normal = normalize(vec3(gl_ModelViewMatrix *inverseViewMatrix * vec4(gl_Normal,0.0)));
worldCoord = vec3(gl_ModelViewMatrix *inverseViewMatrix *gl_Vertex);            //coordinates in world space?
然后在片段着色器中按像素计算灯光:

uniform vec4 lights[30];    //lightPositions...
uniform vec4 lightCol[30];    //...& lightColors passed from the Java-Code
uniform int noOfLights;

varying vec3 normal;
varying vec3 worldCoord;

for(int i = 0; i < noOfLights; i++){

    vec3 lightPos = (lights[i]).xyz;     // lights[i].w does contain data if parallel or point light

    if(lights[i].w == 1.0){     //parallel lights (working fine)


        vec3 lightDir = normalize(lightPos);            //light direction
        float NdotL = max(dot(normal, lightDir), 0.0);

        brightness += (NdotL*lightCol[i].xyz);          //lightCol[i].xyz does contain the color of the light

    }

    else{                       //point lights (not working)

        vec3 lightPosRelative = lightPos - worldCoord;  //Vector from Vertex to point light

        float dist = length(lightPosRelative);

        if(dist < lightCol[i].w){           //lightCol[i].w is the radius of the point light

            vec3 lightDir = normalize(lightPosRelative);    //light direction to point light
            float NdotL = max(dot(normal, lightDir), 0.0);

            float distVal = pow(1.0-(dist/lightCol[i].w), 2.0);     //light attenuation with distance
            distVal = clamp(distVal, 0.0, 1.0);

            brightness += (NdotL*lightCol[i].xyz)*distVal;          //lightCol[i].xyz does contain the color of the light
        }
    }

}

[... brightness is then multiplied with the vertexColor...]
对于平行灯光,结果看起来很好。因此,法线的计算似乎是正确的

但是,点光源仅影响地形(从不旋转或平移),而不影响其他对象(平移和旋转)。 对象的worldCoord计算似乎有问题(我可以通过显示worldCoord而不是亮度来了解这一点)


有什么建议我的代码有什么问题吗

您将
lightPos
作为统一变量和局部变量。Oops。我重命名了一些变量以使代码更易于阅读。看来我把事情搞砸了。固定的
Matrix4f viewMatrix = new Matrix4f();       
Matrix4f inverseViewMatrix = new Matrix4f();                
viewBuffer = BufferUtils.createFloatBuffer(16);

viewBuffer.rewind();
glGetFloat(GL_MODELVIEW_MATRIX, viewBuffer);
viewMatrix = (Matrix4f) viewMatrix.load(modelBuffer);

Matrix4f.invert(viewMatrix, inverseViewMatrix);