2012-01-22 11 views
5

Ho avuto problemi con i miei ombreggiatori. Sto provando a inserire trame e ombre di phong nel mio gioco usando glsl ma non riesco a ottenere alcun effetto positivo.Utilizzo di phong e textures in glsl

Sono alla ricerca di Google da molto tempo e non riesco a trovare nessuna informazione su come connettere ligh e texture insieme, quindi ho deciso di scrivere e chiedere qui.

questo è il mio gioco senza consistenza: without texture

e questo è con struttura:

with texture

Quello che voglio achive è quello di rendere questa texture rosato rendere meglio visibile con spot su un centro - proprio come senza trama, e anche riparare quelle ombreggiature per vertici su grondaie - renderlo per ombreggiatura pixel, non so cosa c'è di sbagliato ora.

Ho controllato circa 10 shader con ombreggiatura phong e ho ottenuto anche per vertice non per ombreggiatura pixel.

Questo è il mio codice di vertice del frammento in cui qualcuno può vedere qualcosa?

varying vec3 N; 
    varying vec3 v; 
    uniform sampler2D myTexture; 

    varying vec2 vTexCoord;  

    void main (void) 
    { 
     vec4 finalColor = vec4(0.0, 0.0, 0.0, 0.0); 

vec3 L = normalize(gl_LightSource[0].position.xyz - v); 
      vec3 E = normalize(-v); // we are in Eye Coordinates, so EyePos is (0,0,0) 
      vec3 R = normalize(-reflect(L,N)); 

      //calculate Ambient Term: 
      vec4 Iamb = gl_FrontLightProduct[0].ambient;  

      //calculate Diffuse Term: 
      vec4 Idiff = gl_FrontLightProduct[0].diffuse * max(dot(N,L), 0.0);  

      // calculate Specular Term: 
      vec4 Ispec = gl_FrontLightProduct[0].specular 
         * pow(max(dot(R,E),0.0),0.3*gl_FrontMaterial.shininess); 

      finalColor+=Iamb + Idiff + Ispec; 
     // write Total Color: 
     gl_FragColor = gl_FrontLightModelProduct.sceneColor + (texture2D(myTexture, vTexCoord)) + finalColor; 
    } 

e la mia vertex shader

varying vec3 N; 
varying vec3 v; 
varying vec2 vTexCoord; 

void main(void) 
{ 

    v = vec3(gl_ModelViewMatrix * gl_Vertex);  
    N = normalize(gl_NormalMatrix * gl_Normal); 
    vTexCoord = vec2(gl_MultiTexCoord0); 

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 


} 

Sarò felice di aiuto.

EDIT:

è così che ho messo la mia texture in shader. Funziona bene (credo) perché posso modificare i valori delle texture nello shader - in qualche modo.

int my_sampler_uniform_location = glGetUniformLocation(brickProg, "myTexture"); 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, texture); 

glUniform1i(my_sampler_uniform_location,0); 
CUTIL::drawBox(); 
glBindTexture(GL_TEXTURE_2D,0); 

EDIT 2:

Dopo Nicol Bolas suggerimento sui colori add ho modificato il mio shader e modificarlo in questo modo:

gl_FragColor = (Texture2D (myTexture, vTexCoord)) + finalColor;

Ora è solo per luminoso, ma ora devo chenge un po 'di luce sul palco e sarebbe fantastico. Ma ancora non ho ottenuto l'ombreggiatura per pixel, invece ho l'ombreggiatura per vertice. Questa è la mia schermata corrente e ho segnato sul esempio quello che voglio dire parlando shading:

enter image description here

+0

È possibile visualizzare il codice in cui si imposta e si passa alle coordinate di texture GL? –

+0

@ MārtiņšMožeiko modificato e aggiunto – sebap123

+0

Cosa succede se si esegue il rendering della trama senza illuminazione? –

risposta

11

Questa equazione:

gl_FragColor = gl_FrontLightModelProduct.sceneColor + (texture2D(myTexture, vTexCoord)) + finalColor; 

non ha alcun senso per la maggior parte delle texture. Stai prendendo il colore prodotto dall'equazione di illuminazione e aggiungendolo al colore campionato dalla texture. Ciò avrebbe senso solo se i valori memorizzati nella trama rappresentavano la luce che emette le proprietà della superficie.

In genere, i valori di colore di una trama rappresentano la riflettanza diffusa di una superficie. Il che significa che è necessario incorporarli direttamente nell'equazione di illuminazione.Il colore della trama dovrebbe sostituire completamente il colore diffuso dal materiale o dovrebbe essere combinato in qualche modo con il colore diffuso del materiale.

+1

Come si deve combinare il colore diffuso con il colore della trama diffusa? Aggiunto? Moltiplicato? Qualcos'altro? È lo stesso per le trame ambientali e speculari? – Kerndog73