2012-01-22 21 views
5

Tengo un problema con mis sombreadores. Estoy tratando de poner texturas y sombreado Phong en mi juego usando GLSL pero no puedo obtener ningún buen efecto.Uso de phong y texturas en glsl

He estado buscando en google durante mucho tiempo, y no puedo encontrar ninguna información sobre cómo conectar luz y textura, así que decidí escribir y preguntar aquí.

Este es mi juego sin textura: without texture

y esto es con textura:

with texture

Lo que quiero achive es hacer esta textura rosáceo hacer más visible con una mancha en una centrar, al igual que sin textura, y también reparar los sombreados por vértices en las canaletas, hacerlo por sombreado de píxeles, no sé qué es lo que está mal ahora.

He comprobado unos 10 sombreadores con sombreado phong y también tengo sombreado por vértice no por píxel.

Este es mi fragmento de código de vértice mayby ​​alguien puede ver allí algo?

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; 
    } 

y mi sombreado de vértices

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; 


} 

me alegraré en busca de ayuda.

EDIT:

así es como me pongo en la textura de sombreado. Funciona bien (creo) porque puedo editar valores de textura en shader, de alguna manera.

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:

Después de Nicol Bolas sugerencia acerca de colores añaden he editado mi Shader y cambiar así:

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

Ahora solo es brillante, pero ahora tengo que hacer un poco de luz en el escenario y sería fantástico. Pero todavía no tengo sombreado por píxel en cambio tengo sombreado por vértice. Este es mi pantalla actual y he marcado en ejemplo lo que quiero decir hablando de sombreado:

enter image description here

+0

¿Se puede mostrar el código donde se configuró y pasar a las coordenadas de textura GL? –

+0

@ MārtiņšMožeiko editado y agregado – sebap123

+0

¿Qué sucede si solo renderizas la textura sin iluminación? –

Respuesta

11

Esta ecuación:

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

No tiene ningún sentido para la mayoría de las texturas. Está tomando el color producido a partir de la ecuación de iluminación y añádalo al color muestreado a partir de la textura. Esto solo tendría sentido si los valores almacenados en la textura representaban la luz que emiten propiedades de la superficie.

En general, los valores de color de una textura representan la reflectancia difusa de una superficie. Lo que significa que necesitas incorporarlos a la ecuación de iluminación directamente.El color de la textura debe reemplazar completamente el color difuso del material o debe combinarse con el color difuso del material de alguna manera.

+1

¿Cómo se debe combinar el color difuso con el color difuso de la textura? ¿Adicional? ¿Multiplicado? ¿Algo más? ¿Es lo mismo para las texturas ambiente y especular? – Kerndog73