glslprocessingshadergouraud

Processing output nothing using gouraud shading


sorry, I am a new on opengl es and processing below processing and shaders output only background

PShader Gouraud,Phong;

rocket = loadShape("rocket.obj");
rocket.setFill(color(800, 0, 0));
Gouraud= loadShader("gouraudfragment.glsl","gouraudvertex.glsl");
Phong= loadShader("phongfragment.glsl","phongvertex.glsl");
background(0);

pushMatrix();
shader(Gouraud);
translate(130,height/2.0);
rotateY(rc);
rotateX(0.4);
noStroke();
fill(#800080);
box(100);

rc+=(0.02+speedCube);
rc*=dirCube;
popMatrix();

pushMatrix();
shader(Gouraud);
translate(width/2, height/2 + 100, -200);
rotateZ(PI);
rotateY(rr);
shape(rocket,100,100);

rr +=( 0.02+speedRocket);
rr*=dirRocket;
popMatrix();

vertex shader

varying vec3 N;
varying vec3 v;
varying vec4 diffuse;
varying vec4 spec;
attribute vec4 position;
attribute vec3 normal;
uniform mat4 modelview;
uniform mat4 projectionMatrix;
uniform mat3 normalMatrix;
uniform vec4 lightPosition;
uniform vec3 lightAmbient;
uniform vec3 lightDiffuse;
uniform vec3 lightSpecular;
uniform float SpecularPower;

void main()
{
   vec4 diffuse;
   vec4 spec;
   vec4 ambient;

   v = vec3(modelview * position);
   N = normalize(normalMatrix * normal);
   gl_Position = projectionMatrix * position;  

   vec3 L = normalize(lightPosition.xyz - v);
   vec3 E = normalize(-v);
   vec3 R = normalize(reflect(-L,N)); 

   ambient = vec4(lightAmbient,100.0);
   diffuse = vec4(clamp( lightDiffuse * max(dot(N,L), 0.0)  , 0.0, 1.0 ) ,100.0);
   spec = vec4(clamp (lightSpecular * pow(max(dot(R,E),0.0),0.3*SpecularPower) , 0.0, 1.0 ),100.0);

   color = ambient + diffuse + spec;
}

fragment shader

void main()
{
    gl_FragColor = color;
}

please help! before apply gouraud shading enter image description here

after apply gouraud shading after Gouraud

The prcessing load the obj and the draw a cube and apply a gouraud shader, but after that only backgroud are shown, the obj loaded and cube is gone. nothing shown!


Solution

  • the shader doesn't even compile and link. The vertex shader has 1 varying output (color), so the framgent shader needs the input varying vec4 color;.

    varying vec4 color;
    

    When you set the clip space position, then the vertex coordinate has to be transformed by the model view and projection matrix:

    gl_Position = projectionMatrix * modelview * position; 
    

    The types specifications of v and N are missing and the types of ambient, diffuse and spec are vec4 rather than vec3.

    Vertex shader:

    attribute vec4 position;
    attribute vec3 normal;
    
    varying vec4 color;
    
    uniform mat4 modelview;
    uniform mat4 projectionMatrix;
    uniform mat3 normalMatrix;
    uniform vec4 lightPosition;
    uniform vec3 lightAmbient;
    uniform vec3 lightDiffuse;
    uniform vec3 lightSpecular;
    uniform float SpecularPower;
    
    void main()
    {
       vec3 v      = vec3(modelview * position);
       vec3 N      = normalize(normalMatrix * normal);
       gl_Position = projectionMatrix * modelview * position;  
    
       vec3 L = normalize(lightPosition.xyz - v);
       vec3 E = normalize(-v);
       vec3 R = normalize(reflect(-L,N)); 
    
       vec4 ambient = vec4(lightAmbient,100.0);
       vec4 diffuse = vec4(clamp( lightDiffuse * max(dot(N,L), 0.0)  , 0.0, 1.0 ) ,100.0);
       vec4 spec = vec4(clamp (lightSpecular * pow(max(dot(R,E),0.0),0.3*SpecularPower) , 0.0, 1.0 ),100.0);
    
       color = ambient + diffuse + spec;
    }
    

    Fragment shader:

    varying vec4 color;
    
    void main()
    {
        gl_FragColor = color;
    }
    

    Of course you have to set at least an ambient light source ambientLight(). You can use a directionalLight(), pointLight() or spotLight(), too.
    But note, your shader can handle 1 light source only. More the 1 light source would gain

    OpenGL error 1282 at top endDraw(): invalid operation

    If you want to use more than 1 light source then you would have to use uniform arrays int the vertex shader for lightPosition, lightAmbient, lightDiffuse, and lightSpecular. See Types of shaders in Processing(https://processing.org/tutorials/pshader/)