2012-01-22 3 views
5

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

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

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

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

with texture

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

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

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

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

EDIT 2:

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

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

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

enter image description here

+0

Можете ли вы показать код, где вы настроили и перейти к координатам текстуры GL? –

+0

@ MārtiņšMožeiko отредактирован и добавлен – sebap123

+0

Что произойдет, если вы просто визуализируете текстуру без освещения вообще? –

ответ

11

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

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

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

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

+1

Как диффузный цвет должен сочетаться с диффузным цветом текстуры? Добавлен? Умножить? Что-то другое? Это то же самое для окружающих и зеркальных текстур? – Kerndog73