Clipping Shader



  • Guten Tag,

    ich versuche mich derzeit an Shadern bezüglich Clipping.
    Mit 1ner ebene geht ohne Probleme aber bei dem versuch das
    Prinzip auf 6 zu erweitern scheiterts.

    Vertex Shader:

    varying float clipDist;
    uniform vec4 myClipPlane0;
    uniform vec4 myClipPlane1;
    uniform vec4 myClipPlane2;
    uniform vec4 myClipPlane3;
    uniform vec4 myClipPlane4;
    uniform vec4 myClipPlane5;
    
    void main()
    {
       float dists[6];
       float maxDist = -10000.0;
       dists[0] = dot(gl_Vertex.xyz, myClipPlane0.xyz) + myClipPlane0.w;
       dists[1] = dot(gl_Vertex.xyz, myClipPlane1.xyz) + myClipPlane1.w; 
       dists[2] = dot(gl_Vertex.xyz, myClipPlane2.xyz) + myClipPlane2.w; 
       dists[3] = dot(gl_Vertex.xyz, myClipPlane3.xyz) + myClipPlane3.w;
       dists[4] = dot(gl_Vertex.xyz, myClipPlane4.xyz) + myClipPlane4.w; 
       dists[5] = dot(gl_Vertex.xyz, myClipPlane5.xyz) + myClipPlane5.w; 
    
       for(int i = 0; i<6;i++)                                          
       {                                                            
          if(dists[i]>maxDist)                                                                                                
             maxDist = dists[i];                                                                                                 
       }                                                            
    
       clipDist = maxDist;
    .
    .
    .
    

    Fragment Shader:

    varying float clipDist;
    void main()
    {
    
       if(clipDist > 0.0)
       {
              discard;
       }
       else
       {
              gl_FragColor = gl_Color;
    
    .
    .
    .
    

    Wenn ich die Shader so nutze wie oben gepostet verwirft er ganze dreiecke sobald einer der eckpunkte auf der "falschen" seite der eben sich befindet.

    Wenn ich aber

    clipDist = dists[0];
    

    mache
    Also nur die 0te verwende clippts wunderbar

    Jemand ne Idee an was es liegen könnte ?

    Mfg


  • Mod

    die werte die du vom vertex ans pixel program uebergibst, werden interpoliert, du kannst also nicht pro vertex irgend einen wert uebergeben der nicht sein gegenstueck bei den anderen vertices hat. du solltest also alle 6 uniforms uebergeben und dann im pixelshader min und dann clippen.



  • guten morgen rapso,
    erst mal vielen dank klappt wunderbar, nur die Erklärung hab ich nicht 100% verstanden könntest du darauf bissle näher eingehen?

    mfg



  • Guten Tag,

    ich hab nun ein anderes Problem mit meinem Shader, geclippt wird alles wie gewollt nur gibts es Probleme mit der Darstellung.
    Also Ausgangssitutation ist das ich ein Objekt hab des eine Textur von einem anderen Shader bekommt aber wenn ich nun mein Shader drauf anwende wird die Textur verworfen.

    Dürfte eigentlich kein großes Problem sein da, oder ? Finde nur leider nix im Orange Book dazu...

    Shader schauen nun so aus:

    Vertex:

    varying vec3 lightDir,normal;
    
    uniform vec4 myClipPlane0;
    uniform vec4 myClipPlane1;
    uniform vec4 myClipPlane2;
    uniform vec4 myClipPlane3;
    uniform vec4 myClipPlane4;
    uniform vec4 myClipPlane5;
    
    varying float dist0;
    varying float dist1;
    varying float dist2;
    varying float dist3;
    varying float dist4;
    varying float dist5;
    
    void main()
    {
    
       dist0 = dot(gl_Vertex.xyz, myClipPlane0.xyz) + myClipPlane0.w;
       dist1 = dot(gl_Vertex.xyz, myClipPlane1.xyz) + myClipPlane1.w; 
       dist2 = dot(gl_Vertex.xyz, myClipPlane2.xyz) + myClipPlane2.w; 
       dist3 = dot(gl_Vertex.xyz, myClipPlane3.xyz) + myClipPlane3.w;
       dist4 = dot(gl_Vertex.xyz, myClipPlane4.xyz) + myClipPlane4.w; 
       dist5 = dot(gl_Vertex.xyz, myClipPlane5.xyz) + myClipPlane5.w; 
    
       gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    
    }
    

    Fragment:

    varying float dist0;
    varying float dist1;
    varying float dist2;
    varying float dist3;
    varying float dist4;
    varying float dist5;
    
    void main()
    {
       float dists[6];
       float maxDist = -10000.0;
    
       dists[0] = dist0;dists[1] = dist1;dists[2] = dist2;
       dists[3] = dist3;dists[4] = dist4;dists[5] = dist5;
    
       for(int i = 0; i<6;i++)                                          
       {                                                            
          if(dists[i]>maxDist)                                                                                                
             maxDist = dists[i];                                                                                                 
       }                    
       if(maxDist > 0.0)
       {
              discard;
       }
       else
       {
          gl_FragColor = gl_Color;
    
        }
    }
    


  • kannst du die zeile im fragmentshader bitte aufzeigen wo du die textur anwendest und sie verworfen wird.



  • also den ganzen Code vom Shader mit der Textur kann ich leider nicht posten

    vec4 texture = texture2D(textureUnit, t1);									
    		gl_FragColor = texEnv(gl_Color, texture);
    

    findet dann die berechnung statt z.b gl_Color*texture
    Der Shader funktioniert soweit gut, mein problem ist nun das ich das Objekt schneiden möchte und dabei alles beibehalten was des Objekt ausmacht, also Texturen, Farbe usw.
    Hatte gehofft das all diese Daten in gl_Color vorhanden sind.

    Verworfen wird die ganze geschihte sobald ich die oben geposten shader anwende!



  • so ich habe grad nachgelesen das immer nur 1ne main vorhanden sein im Fragment bzw VertexShader. Das wird aber hier verletzt wie ich grad seh.
    Was für lösungsoptionen hab ich die beiden Shader zusammenzuführen ?


  • Mod

    koala schrieb:

    Verworfen wird die ganze geschihte sobald ich die oben geposten shader anwende!

    du samplest die textur nicht, wunderst dich weshalb sie nicht gesampelt wird?

    koala schrieb:

    Was für lösungsoptionen hab ich die beiden Shader zusammenzuführen ?

    1. inder angagieren
    2. ich kopiere sie zusammen fuer nen hunni
    3. selber zusammenbauen.


Anmelden zum Antworten