Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL点光源未正确转换_Java_Opengl_Camera_Glsl_Lighting - Fatal编程技术网

Java OpenGL点光源未正确转换

Java OpenGL点光源未正确转换,java,opengl,camera,glsl,lighting,Java,Opengl,Camera,Glsl,Lighting,我正在为我基于LWJGL的游戏引擎添加基本点光源。我使用OpenGL固定功能灯光进行位置和颜色,但我使用着色器进行实际的照明计算。我的问题是从世界空间到眼睛空间坐标的转换。我的目标是使光处于相对于世界的固定位置。我知道,当你设置灯光的位置时,它会被OpenGL矩阵堆栈转换,就像几何体一样。但是,当我移动相机时,灯光会发生变化。在每个帧的渲染阶段开始时调用函数clearRenderer(已经设置了GL_投影矩阵): 下面是在上面的代码中调用的Light类中的drawLights函数: public

我正在为我基于LWJGL的游戏引擎添加基本点光源。我使用OpenGL固定功能灯光进行位置和颜色,但我使用着色器进行实际的照明计算。我的问题是从世界空间到眼睛空间坐标的转换。我的目标是使光处于相对于世界的固定位置。我知道,当你设置灯光的位置时,它会被OpenGL矩阵堆栈转换,就像几何体一样。但是,当我移动相机时,灯光会发生变化。在每个帧的渲染阶段开始时调用函数
clearRenderer
(已经设置了GL_投影矩阵):

下面是在上面的代码中调用的
Light
类中的
drawLights
函数:

public static void drawLights() {
    for (int i = 0; i < numLights; i++) {
        lights[i].drawLight();
    }
}

public void drawLight() {
    FloatBuffer buff = BufferUtils.createFloatBuffer(4);
    pos.store(buff); // pos is the position of the light in world-space
    buff.put(1.0f);
    buff.flip();
    glLight(GL_LIGHT0 + index, GL_POSITION, buff);
}
和片段着色器:

uniform float time;

uniform vec3 m_ambient;
uniform vec3 m_diffuse;
uniform vec3 m_specular;

uniform sampler2D tex;

varying vec3 normal;

void main() {

    vec4 lightPos = gl_LightSource[0].position;

    vec4 color = texture2D(tex, gl_TexCoord[0].st);
    vec3 light = m_ambient;
    float f = dot(normalize((lightPos - gl_FragCoord).xyz), normalize(normal));

    f = clamp(f, 0.0, 1.0);

    light += m_diffuse * f;
    color.a = 1.0;
    gl_FragColor = color * vec4(light, 1.0);
}

很明显,以下三种情况之一没有得到正确的变换:顶点、法线或灯光位置。我知道顶点的变换是正确的,因为几何体出现在它应该出现的地方。当我从灯光的位置减去frag坐标时,frag着色器中是否存在错误?或者光线位置没有正确转换到眼睛空间?

好的,修复了它。我做错了几件事。主要来说,gl_FragCoord实际上是指屏幕上的像素位置,这与眼睛空间不同。所以我只做了一个统一的变量来存储顶点的眼空间坐标。此外,灯光位置和法线不会通过GL_投影矩阵进行变换,因此我必须确保不会通过该矩阵变换我的位置变量

此外,要设置灯光的位置,只需按位置平移GL_MODELVIEW矩阵,并使用包含0、0、0、1的缓冲区作为位置,就更容易了

uniform float time;

varying vec3 normal;

void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    normal = (gl_NormalMatrix * gl_Normal);
    gl_TexCoord[0] = gl_MultiTexCoord0;
}
uniform float time;

uniform vec3 m_ambient;
uniform vec3 m_diffuse;
uniform vec3 m_specular;

uniform sampler2D tex;

varying vec3 normal;

void main() {

    vec4 lightPos = gl_LightSource[0].position;

    vec4 color = texture2D(tex, gl_TexCoord[0].st);
    vec3 light = m_ambient;
    float f = dot(normalize((lightPos - gl_FragCoord).xyz), normalize(normal));

    f = clamp(f, 0.0, 1.0);

    light += m_diffuse * f;
    color.a = 1.0;
    gl_FragColor = color * vec4(light, 1.0);
}