2

GLSL フラグメントと頂点シェーダーで、下の画像に似たスタッコ テクスチャを作成しようとしています。

ここに画像の説明を入力

これを達成するには複数の方法があることを知っています。ただし、ノイズ関数から受け取った値に基づいて、フラグメント シェーダーでサーフェス法線を乱すことに焦点を当てたいと思います。

私の思考プロセスは次のとおりです..

  1. 現在の位置をスカラーでスケーリングしたノイズ関数を送信します。
  2. ノイズを取得したら、サーフェス法線を乱して、フォン シェーディング モデルで使用できます。

しかし、そこからどこへ行くのかわかりません。

これが私がこれまでに持っているものです。

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);
}

さて、私の実際の質問に。

  1. どの法線をオフセットしますか? オブジェクトの法線をオフセットしますか? バンプ マッピングはオブジェクト スペースで行う必要があると読んでいます。

  2. オフセットを法線に適用する最良の方法は何ですか?

システム情報: Mac OSX - OpenGL 3.2 - シェーダーは、新しい 3.2 をサポートしていない古い Mac でも動作する必要があります。

4

0 に答える 0