Opengl 法线贴图和带反射的镜面反射贴图
我正在使用ogre3d网格查看模型。我已经写了一个着色器,可以处理法线贴图、反射、镜面反射贴图。但法线贴图无法如图所示工作 正如你所看到的,反射在起作用,深凹贴图也在起作用,但我不需要看到法线贴图,凹凸贴图也在起作用 我已经尝试禁用所有功能,并输出法线贴图及其纹理和采样正确的结果,镜面反射贴图和漫反射贴图也是如此 这是GLSL VS /* 环境立体反射 法线映射 四重映射缩放 */Opengl 法线贴图和带反射的镜面反射贴图,opengl,glsl,shader,ogre3d,Opengl,Glsl,Shader,Ogre3d,我正在使用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;
}