GLSL フラグメントと頂点シェーダーで、下の画像に似たスタッコ テクスチャを作成しようとしています。
これを達成するには複数の方法があることを知っています。ただし、ノイズ関数から受け取った値に基づいて、フラグメント シェーダーでサーフェス法線を乱すことに焦点を当てたいと思います。
私の思考プロセスは次のとおりです..
- 現在の位置をスカラーでスケーリングしたノイズ関数を送信します。
- ノイズを取得したら、サーフェス法線を乱して、フォン シェーディング モデルで使用できます。
しかし、そこからどこへ行くのかわかりません。
これが私がこれまでに持っているものです。
Vertex shader - Calculate Tangent は、オブジェクト ノルムに基づいて接線ベクトルを構築するためのヘルパー メソッドです。
#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 でも動作する必要があります。