При использовании фонга и текстур в glsl

У меня проблема с шейдерами. Я пытаюсь добавить текстуры и затенение фонга в свою игру с помощью glsl, но не могу добиться хорошего эффекта.

Я долго искал в Google и не могу найти никакой информации о том, как соединить свет и текстуру вместе, поэтому я решил написать и спросить здесь.

Это моя игра без текстуры: without texture

и это с текстурой:

with texture

Я хочу сделать эту розоватую текстуру лучше видимой с пятном в центре - точно так же, как без текстуры, а также исправить затенение вершин на желобах - сделайте так, чтобы пиксельное затенение, теперь не знаю, что не так.

Я проверил около 10 шейдеров с затенением по фонгу, и я получил также затенение на вершину, а не на пиксель.

Это мой фрагмент вершинного кода, может кто-то там что-то увидит?

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

и мой вершинный шейдер

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;


}

Буду рад помощи.

РЕДАКТИРОВАТЬ:

вот как я помещаю свою текстуру в шейдер. Он отлично работает (я думаю), потому что я могу каким-то образом редактировать значения текстуры в шейдере.

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

РЕДАКТИРОВАТЬ 2:

После предложения Николаса Боласа о добавлении цветов я отредактировал свой шейдер и изменил его следующим образом:

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

Теперь это только на яркое, но теперь мне нужно немного поменять свет на сцене, и было бы здорово. Но все же у меня нет попиксельного затенения, вместо этого у меня есть затенение по вершинам.Это мой текущий экран, и я отметил на примере, что я имею в виду, говоря о затенении:

enter image description here

5
задан sebap123 23 January 2012 в 12:20
поделиться