Opengl 法线贴图和带反射的镜面反射贴图

Opengl 法线贴图和带反射的镜面反射贴图,opengl,glsl,shader,ogre3d,Opengl,Glsl,Shader,Ogre3d,我正在使用ogre3d网格查看模型。我已经写了一个着色器,可以处理法线贴图、反射、镜面反射贴图。但法线贴图无法如图所示工作 正如你所看到的,反射在起作用,深凹贴图也在起作用,但我不需要看到法线贴图,凹凸贴图也在起作用 我已经尝试禁用所有功能,并输出法线贴图及其纹理和采样正确的结果,镜面反射贴图和漫反射贴图也是如此 这是GLSL VS /* 环境立体反射 法线映射 四重映射缩放 */ 我在你的图片中看到一个错误,“不同类型的采样器指向相同的纹理单位”。很抱歉,这是着色器中的一个错误,但上面的一个

我正在使用ogre3d网格查看模型。我已经写了一个着色器,可以处理法线贴图、反射、镜面反射贴图。但法线贴图无法如图所示工作

正如你所看到的,反射在起作用,深凹贴图也在起作用,但我不需要看到法线贴图,凹凸贴图也在起作用

我已经尝试禁用所有功能,并输出法线贴图及其纹理和采样正确的结果,镜面反射贴图和漫反射贴图也是如此

这是GLSL VS

/* 环境立体反射 法线映射 四重映射缩放 */


我在你的图片中看到一个错误,“不同类型的采样器指向相同的纹理单位”。很抱歉,这是着色器中的一个错误,但上面的一个正在正常工作。我更新了图片
TBN
(world2Tangent)矩阵必须使用规范化向量构建。我没有看到你规范化“binormal”。我已经规范化了binormal,但法线贴图可能仍然不起作用,但感谢tipI在你的图片中看到错误,“不同类型的采样器指向相同的纹理单位”。很抱歉,这是着色器中的一个错误,但是上面的一个工作正常,我更新了图片
TBN
(world2Tangent)矩阵必须使用规范化向量构建。我看不出你规范化了“双法线”。我已经规范化了双法线,法线映射可能仍然不起作用,但谢谢你的提示
#version 120
#define lowp
#define mediump
#define highp

attribute vec4 vertex;
attribute vec3 normal;
attribute vec4 uv0;
attribute vec4 uv1;
attribute vec4 tangent;
//attribute vec3 binormal;

uniform mat4 normalMatrix;
uniform mat4 modelViewProjectionMatrix;
uniform mat4 modelView;
uniform vec3 camera_world_position;
uniform mat4 textureMatrix0;

varying vec2 texCoord[2];
varying vec3 viewWorld;
varying mat3 world2Tangent;


void main()
{       
    gl_Position = modelViewProjectionMatrix * vertex;

    // transform the uv coordinates
    texCoord[0] = (textureMatrix0 * uv0).xy;
    texCoord[1] = uv1.xy;

    //world.
    vec3 vertexWorld = vec3(modelView * vertex);

    //transform world to tangent.
    //world2Tangent = mat3(normalMatrix) * mat3(tangent, binormal, normal);

    // no binormal in ogre?. must reconstruct. Ogre inverts?
    vec3 binormal = cross ( normal, tangent.xyz ) * tangent.www;
    world2Tangent = mat3(normalMatrix) * mat3(tangent.xyz, binormal, normal);

    //Camera Position
    //Use Light0 instead of camera position to match phong specular with environment reflection 
    viewWorld = normalize( - vertexWorld );

} 


#version 120
#define lowp
#define mediump
#define highp

uniform sampler2D diffuseColorMap;
uniform sampler2D ambientOcclusionMap;
uniform sampler2D normalMap;
uniform sampler2D specularMap;
uniform samplerCube envMap;

uniform float diffuseFactor;
uniform float reflectionFactor;
uniform float opacity;

varying vec2 texCoord[2];
varying mat3 world2Tangent;
varying vec3 viewWorld;

void main()
{
    //unpack current normal in tangent space
     vec3 normal = 2.0 * texture2D (normalMap, texCoord[0].st).rgb - 1.0;



    // environment reflection in world space
    vec3 normalWorld = normalize(world2Tangent * normal);
    vec3 refDir = viewWorld - 2.0 * dot(viewWorld,normalWorld) * normalWorld;

    vec4 diffuseColor = texture2D( diffuseColorMap, texCoord[0] );

    //mix ambient material with reflection
    vec4 final = diffuseFactor * ( diffuseColor * texture2D(ambientOcclusionMap, texCoord[0]) ) +
    reflectionFactor * ( textureCube(envMap,refDir) * texture2D(specularMap, texCoord[0]) );
    final.a = diffuseColor.a * opacity;
    gl_FragColor= final;
}