Procesing multiple light pixel Shader in GLSL

i have wirtten a fragment shader that works just fine with a single light. Now I am trying to adpat it to work with 8 lights, the implement it in Processing. Clearly I am doing something wrong in the math and I cannot see what it is... I have read other posts about this and try to adapt the answer to my problem, no luck though...

////Fragment/////

#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif

uniform mat4 modelview;
uniform mat4 normalMatrix;

uniform int lightCount;
uniform vec4 lightPosition[8];

attribute vec4 vertex;
attribute vec3 normal;

varying vec4 vertColor;



void main() {  

    vec3 vertexCamera = vec3(modelview * vertex);
    vec3 transformedNormal = normalize(normalMatrix * normal);

float intensity = 0.0;

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

    vec3 direction = normalize(lightPosition[i].xyz - vertexCamera);
    intensity += max(0.0, dot(direction, transformedNormal));

    }

 gl_FragColor = vec4(intensity, intensity, intensity, 1) * vertColor;
}

////vertex/////

    #define PROCESSING_LIGHT_SHADER


    uniform mat4 transform;
    uniform mat3 normalMatrix;

    attribute vec4 vertex;
    attribute vec4 color;

    varying vec4 vertColor;


    void main() {
      gl_Position = transform * vertex;    

      vertColor = color;
}

Answers

  • Sin título

    Without loops, for a single light, it just works fine.

  • The vertex shader is used first. Try calculating the light direction in a loop in the vertex shader and saving it in a varying array. The fragment shader can then take that array and work calculate the light intensities from there.

Sign In or Register to comment.