提示画像ですが平行光源を使ったフォングの反射モデルですが黒い部分は光当たっていない面の色だと思うのですがこれはシェーダーが間違えているためのバグなのでしょうか?平行光源の向きを画面に表示させるには難易度が高すぎて出来ないの質問でしました。
CPP
1/***************************************************************************************************************** 2* ライティング .vert 3******************************************************************************************************************/ 4 5#version 400 6 7//************ layout 8layout(location = 0) in vec3 in_Position; //頂点座標 9layout(location = 1) in vec2 in_TexCoord; //テクスチャ座標 10layout(location = 2) in vec3 in_Normal; //法線 11 12//************ uniform 13uniform mat4 worldMatrix; //ワールド行列 14uniform mat4 viewMatrix; //ビュー行列 15 16//************ フラグメントの送る 17out vec2 fragTexCoord; //UV 18out vec3 fragNormal; //法線 19out vec3 fragWorldPos; //ワールド空間(位置) 20 21/////////////////////////////////////////////////////// 22void main() 23{ 24 //同次元座標に変換してワールド座標に変換 25 vec4 pos = vec4(in_Position, 1.0); 26 pos = worldMatrix * pos; 27 fragWorldPos = pos.xyz; 28 29 30 vec4 p = vec4(in_Position, 1.0); 31 gl_Position = viewMatrix * pos; 32 33 //fragNormal = (vec4(inNormal, 0.0f) * worldMatrix).xyz; 34 fragNormal = in_Normal; 35 36 fragTexCoord = in_TexCoord; 37} 38/////////////////////////////////////////////////////// 39
CPP
1/***************************************************************************************************************** 2* ライティング .frag 3******************************************************************************************************************/ 4#version 400 5 6//並行光源用の構造体 7struct DirectionalLight 8{ 9 vec3 mDirection; //光の方向 10 vec3 mDiffuseColor; //拡散反射色 11 vec3 mSpecColor; //鏡面反射色 12}; 13 14//************ .vertexから来た 15in vec2 fragTexCoord; //UV 16in vec3 fragNormal; //法線 17in vec3 fragWorldPos; //ワールド空間(位置) 18 19//************ uniform 20uniform sampler2D uTexture; //テクスチャ画像 21 22uniform vec3 CameraPos; //カメラ位置 23uniform vec3 AmbientLight; //環境光の強さ 24uniform float SpecPower; //表面の鏡反射指数 25 26uniform DirectionalLight DirLight; //平行光源 27 28//************ 画面に出力 29out vec4 out_color; //色 30 31/////////////////////////////////////////////////////// 32void main() 33{ 34 //表面法線 N 35 //vec3 N = normalize(fragNormal); 36 vec3 N = fragNormal; 37 38 //表面から光源へのベクトル L 39 vec3 L = normalize(-DirLight.mDirection); 40 41 //表面からカメラへのベクトル V 42 vec3 V = normalize(CameraPos - fragWorldPos); 43 44 //Nに関する -L の反射 R 45 vec3 R = normalize(reflect(-L, N)); 46 47 //フォンの反射を計算する 48 vec3 Phong = AmbientLight; 49 float NdotL = dot(N, L); 50 if (NdotL >= 0) 51 { 52 vec3 Diffuse = DirLight.mDiffuseColor * NdotL; 53 vec3 Specular = DirLight.mSpecColor * pow(max(0.0, dot(R, V)), SpecPower); 54 Phong += Diffuse + Specular; 55 } 56 57 //最終的な色はテクスチャの色 x フォンの光(alpha = 1) 58 59 out_color = texture(uTexture, fragTexCoord) * vec4(Phong, 1.0); 60 61// out_color = texture(uTexture, fragTexCoord); 62 63} 64/////////////////////////////////////////////////////// 65
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/11/24 11:56 編集
2020/11/24 11:54
退会済みユーザー
2020/11/24 12:02
2020/11/24 12:08
退会済みユーザー
2020/11/24 12:34 編集
2020/11/25 03:03