我正在尝试在 GLSL 片段和顶点着色器中创建类似于下图的灰泥纹理。
我知道有多种方法可以做到这一点。但是,我想专注于根据我从噪声函数接收到的值来扰乱片段着色器中的表面法线。
我的思考过程如下..
- 将噪声函数发送到我当前位置按某个标量缩放。
- 一旦我有了噪声,我就可以扰动表面法线并将其与我的 Phong 着色模型一起使用。
但是,我不确定我从那里去哪里。
这是我到目前为止所拥有的。
顶点着色器 - 计算切线是基于对象范数构建切线向量的辅助方法。
#version 120
varying vec3 LightDir;
varying vec3 EyeDir;
varying vec3 MCPoint;
main(){
MCPoint = gl_Vertex.xyz;
EyeDir = vec3(gl_ModelViewMatrix * gl_Vertex);
vec3 LightPosition = gl_LightSource[0].position.xyz;
vec3 tangent = calculateTangent(gl_Normal);
// Building the Tangent matrix
vec3 n = normalize(gl_NormalMatrix * gl_Normal);
vec3 t = normalize(gl_NormalMatrix * tangent);
vec3 b = cross(n, t);
vec3 v;
v.x = dot(LightPosition, t);
v.y = dot(LightPosition, b);
v.z = dot(LightPosition, n);
LightDir = normalize(v);
v.x = dot(gl_vertex.xyz, t);
v.y = dot(gl_Vertex.xyz, b);
v.z = dot(gl_Vertex.xyz, n);
EyeDir = normalize(v);
gl_Position = ftransform();
}
片段着色器 - 到目前为止...
#version 120
varying vec3 LightDir;
varying vec3 EyeDir;
varying vec3 MCPoint;
main(){
vec2 _noisexy = noise2(MCPoint.xy * 1.65);
// offset normal
// Calculate phong shading based on LightDir, EyeDir, & Newly distorted Normal
gl_FragColor= intensity * vec4(my_surface_color, 1.0);
}
现在,我的实际问题。
我抵消什么正常?我会正常偏移物体吗?我一直在读到凹凸映射应该发生在对象空间中。
将偏移量应用于法线的最佳方法是什么?
一些系统信息:Mac OSX - OpenGL 3.2 - 着色器必须能够在不支持新 3.2 的旧 Mac 上工作。