Java LWJGL将向量3F数组输入片段着色器

Java LWJGL将向量3F数组输入片段着色器,java,opengl,glsl,shader,lwjgl,Java,Opengl,Glsl,Shader,Lwjgl,我目前正在制作LWJGL2游戏。我正在使用中的库(例如纹理和着色器程序类)。我知道,可以在着色器中渲染有限数量的灯光,但我没有找到任何解决方案使灯光更具动态性和效率。 我想将Vector3f[]lights作为统一的vec3 lights[]传递到.frag文件中。我该怎么做?还有其他关于动态更改阴影中灯光数量的想法吗?以下是片段着色器的代码: //attributes from vertex shader varying vec4 vColor; varying vec

我目前正在制作LWJGL2游戏。我正在使用中的库(例如纹理和着色器程序类)。我知道,可以在着色器中渲染有限数量的灯光,但我没有找到任何解决方案使灯光更具动态性和效率。 我想将Vector3f[]lights作为统一的vec3 lights[]传递到.frag文件中。我该怎么做?还有其他关于动态更改阴影中灯光数量的想法吗?以下是片段着色器的代码:

    //attributes from vertex shader
    varying vec4 vColor;
    varying vec2 vTexCoord;

    uniform sampler2D u_texture;  
    uniform sampler2D u_normals;   


    //the array should be inserted as:

    uniform vec3 Lights[];  

    uniform int numOfLights;          
    uniform vec2 Resolution;     
    uniform float Rotation;      
    //uniform vec3 LightPos;   
    uniform vec4 LightColor;      
    uniform vec4 AmbientColor;  
    uniform vec3 Falloff;      

    void main() {

    vec4 sumColor = vec4(0.0,0.0,0.0,0.0);

    for(int i = 0;i < numOfLights;i++){
    vec3 LightPos = Lights[i];

    vec4 DiffuseColor = texture2D(u_texture, vTexCoord);
    vec3 NormalMap = texture2D(u_normals, vTexCoord).rgb;


    vec3 LightDir = vec3(LightPos.x - gl_FragCoord.x/ Resolution.x,LightPos.y - gl_FragCoord.y / Resolution.y, LightPos.z);

    float D = length(LightDir);

    vec3 N = normalize(NormalMap * 2.0 - 1.0);
    float LRot = atan(LightDir.y, LightDir.x);
    vec3 L = normalize(vec3(cos(LRot + Rotation),sin(LRot + Rotation),LightDir.z + 0.5));

    vec3 Diffuse = (LightColor.rgb * LightColor.a) * max(dot(N, L), 0.0);

    vec3 Ambient = AmbientColor.rgb * AmbientColor.a;

    float Attenuation = 1.0 / ( Falloff.x + (Falloff.y*D) + (Falloff.z*D*D) );

    vec3 Intensity = 2 * Ambient + Diffuse * Attenuation;
    vec3 FinalColor = DiffuseColor.rgb * Intensity;
//sumColor gets added as many times as there are lights
    sumColor = sumColor + vColor * vec4(FinalColor, DiffuseColor.a);
    }
    gl_FragColor = sumColor;
}

如果我可以将灯光存储在列表数组中并将其传递到片段着色器中,那就更好了。

我担心OpenGL中的灯光会出现问题。如果要执行所谓的正向着色,则着色器中必须有有限数量的灯光。 有几种方法可以进行更高级的照明计算,并且仍然具有良好的性能,其中之一是延迟着色

你可以在这里找到一篇关于这方面的好文章


遗憾的是它使用C++,但是我希望你能找到更多关于如何使用java来做的信息。嗯,是的!谢谢你的快速回答!
public Vector3f[] lights;
//all the lights get add into the array
shader.setUniformf("Lights", lights);