问题1:基于世界坐标存储的world space normal为固定值,如果物体表面朝向没有保持原来的方向和位置,会产生错位计算误差。 方法1:改为基于局部坐标存储object space normal,使得能够在面旋转、位移变换时不会与法线贴图的法向量方向产生错位,从贴图里解压后,需要再乘以 model-view 矩阵转换到世界坐标,以及后续转换到
// convert to range -1.0 to 1.0 vec3 normal = NormalMap.xyz * 2.0 - 1.0; vec3 N = normalize(normal.xyz); vec3 L = normalize(lightDirection.xyz); float fNDotL = dot(N,L); vec3 fvReflection = normalize( 2 * normal * fNDotL - lightDirection); float fRDotV = max(dot(fvReflec...
最近在使用OpenGL折腾Normal Mapping。说白了就是有一个纹理,里面存储的是法向量。在计算光照时,用该纹理中采样得到的法向量来替代几何体原法向量进行光照计算。这个存储法向量的纹理叫做Normal Map。有时候场景资源不会直接给你Normal Map,而是给你一个Height Map,该纹理中只存储了一个通道,是[0,1]的灰度值,可以...
Normal Mapping 也就是法线映射,简单的讲就是通过读取一张存储着法线信息的纹理来计算光照(而不直接简单地通过顶点法线的插值),这样可以明显增强图像的真实感。法线贴图(Normal Map):法线贴图是存储法线的一张贴图,法线的xyz的值经过归一化之后再被映射成为对应的RGB值。归一化的法线值范围为[-1,1],而RGB的每一...
By slowly moving the light source over time you really get a sense of depth using the normal map. Running this normal mapping example gives the exact results as shown at the start of this chapter: There is one issue however that greatly limits this use of normal maps. The normal map we...
For parallax mapping we're going to use a simple 2D plane for which we calculated its tangent and bitangent vectors before sending it to the GPU; similar to what we did in the normal mapping chapter. Onto the plane we're going to attach a diffuse texture, a normal map, and a ...
Mappingvec3 viewDir=normalize(fs_in.TangentViewPos-fs_in.TangentFragPos);vec2 texCoords=ParallaxMapping(fs_in.TexCoords,viewDir);// then sample textures with new texture coordsvec3 diffuse=texture(diffuseMap,texCoords);vec3 normal=texture(normalMap,texCoords);normal=normalize(normal*2.0-1.0);...
它是根据顶点的其他属性来产生纹理坐标。比如GL_OBJECT_LINEAR和GL_EYE_LINEAR,在object space和eyes pace内的顶点坐标分别被用来产生纹理坐标。另外一些方式使用了其他补贴的属性。GL_SPEREMAP和GL_REFLECTION_MAP使用了eye space顶点坐标和法线。GL_NORMAL_MAP则是根据法线向量产生纹理坐标。
ParallaxMapping(Texcoords, viewDir_T);vec3 diffuseColor = texture2D(diffuseMap, texcoords).rgb;vec3 testdiffuseColor = texture2D(diffuseMap, Texcoords).rgb;vec3 ambient = 0.1 * diffuseColor;vec3 normal_T = normalize((texture2D(normalMap, texcoords).rgb - 0.5));vec3 normal = vec3(0.0...
uniform sampler2D normalMap; uniform sampler2D depthMap; uniform bool parallax; uniform float height_scale; vec2 ParallaxMapping(vec2 texCoords, vec3 viewDir) { // number of depth layers const float minLayers = 10; const float maxLayers = 20; ...