Использование фонга и текстур в glsl - PullRequest
5 голосов
/ 22 января 2012

У меня проблема с моими шейдерами. Я пытаюсь использовать текстуры и затенение фонгов в моей игре, используя 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;


}

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

EDIT:

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

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

1 Ответ

12 голосов
/ 23 января 2012

Это уравнение:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...