когда я использую нормаль модели, результат в порядке (есть темные области и освещенные области, как и следовало ожидать от простого диффузного шейдера Ламберта)
но когда я использую карту нормалей, темные области загораются!
я хочу использовать карту нормалей и по-прежнему получать правильное рассеянное освещение, как в этих примерах
вот код с отображением нормалей и без них
и вот код, использующий карту нормалей
Вершинный шейдер
varying vec3 normal,lightDir;
attribute vec3 vertex,normalVec,tangent;
attribute vec2 UV;
void main(){
gl_TexCoord[0] = gl_TextureMatrix[0] * vec4(UV,0.0,0.0);
normal = normalize (gl_NormalMatrix * normalVec);
vec3 t = normalize (gl_NormalMatrix * tangent);
vec3 b = cross (normal, t);
vec3 vertexPosition = normalize(vec3(gl_ModelViewMatrix * vec4(vertex,1.0)));
vec3 v;
v.x = dot (lightDir, t);
v.y = dot (lightDir, b);
v.z = dot (lightDir, normal);
lightDir = normalize (v);
lightDir = normalize(vec3(1.0,0.5,1.0) - vertexPosition);
gl_Position = gl_ModelViewProjectionMatrix*vec4(vertex,1.0);
}
Фрагментный шейдер
vec4 computeDiffuseLight (const in vec3 direction, const in vec4 lightcolor, const in vec3 normal, const in vec4 mydiffuse){
float nDotL = dot(normal, direction);
vec4 lambert = mydiffuse * lightcolor * max (nDotL, 0.0);
return lambert;
}
varying vec3 normal,lightDir;
uniform sampler2D textures[8];
void main(){
vec3 normalVector = normalize( 2 * texture2D(textures[0],gl_TexCoord[0].st).rgb - 1 );
vec4 diffuse = computeDiffuseLight (lightDir, vec4(1,1,1,1) , normalVector, vec4(0.7,0.7,0.7,0));
gl_FragColor = diffuse ;
}
Примечание: фактическое отображение нормалей работает правильно, как видно из зеркальных бликов.
я использовал Assimp для загрузки модели (md5mesh) и вычислил касательные также с помощью Assimp, а затем отправил их в шейдеры в качестве атрибута
вот ссылка на код и скриншоты проблемы
https://dl.dropboxusercontent.com/u/32670019/code%20and%20screenshots.zip
это проблема в коде или у меня неправильное представление?
Обновленный код и скриншоты
https://dl.dropboxusercontent.com/u/32670019/updated%20code%20and%20screenshots.zip
теперь карта нормалей работает с диффузом, но сам по себе диффуз не корректен
#version
директивы? - person genpfault   schedule 14.05.2013