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