提示コードですがこれはフォンのシェーディングとして正しいのでしょうか?方向を触ると光沢は出ないのですが光の当たり方で明暗が分かれるのですがこれは実装としてフォンのシェーディングは実装出来ているのでしょうか?
※提示画像のようにフォンのシェーディングの光沢が出ません。
提示画像の左上の数値は光の方向です。
cpp
1// ##################################### コンストラクタ ##################################### 2Game::Game(std::shared_ptr<FrameWork::Window> w) : Scene(w, Sequence::Game) 3{ 4 sprite = std::make_shared<FrameWork::Sprite>(w, "Shader/2D/BasicPhong_2D.vert", "Shader/2D/BasicPhong_2D.frag"); 5 sprite->setTexture(FrameWork::LoadTexture("Assets/debug_texture.png")); 6 text = std::make_unique<FrameWork::Text>(w); 7 8 9 cameraPos = glm::vec3(0,0,10); 10 ambientLight = glm::vec3(0.2, 0.2, 0.2); 11 direction = glm::vec3(0.0, 0.0, -1.0); 12 //direction = glm::vec3(-1.0,1.0,-1.0); 13 specPower = 1; 14 15} 16 17
glsl
1/*######################################################################### 2# フォング フラグメントシェーダー 3###########################################################################*/ 4#version 330 5 6#extension GL_ARB_explicit_attrib_location: enable 7 8 9 10// ###################### 変数 ###################### 11 12//ライト 13struct DirectionalLight 14{ 15 vec3 mDirection; // 平行光源 16 vec3 mDiffuseColor; // 拡散反射色 17 vec3 mSpecColor; // 鏡面反射色 18}; 19 20// ###################### 入力 ###################### 21layout(location = 3) in vec2 vUV; //UV座標 22layout(location = 4) in vec3 vNorm; //法線 23layout(location = 5) in vec3 vPosition; //座標 24 25// ###################### Unifrom ###################### 26uniform sampler2D uImage; //イメージ 27 28uniform vec3 uCameraPos; //カメラ 29uniform float uSpecPower; //鏡面反射強さ 30uniform vec3 uAmbientLight; //環境光 31 32uniform DirectionalLight uDirLight; //平行光源 33 34 35 36// ###################### 出力 ###################### 37out vec4 fragment; 38 39 40 41 42 43void main() 44{ 45 vec3 N = normalize(vNorm); 46 vec3 L = normalize(-uDirLight.mDirection); 47 vec3 V = normalize(uCameraPos - vPosition); 48 vec3 R = normalize(reflect(-L, N)); 49 50 vec3 Phong = uAmbientLight; 51 float NdotL = dot(N,L); 52 if(NdotL > 0) 53 { 54 vec3 Diffuse = uDirLight.mDiffuseColor * NdotL; 55 vec3 Specular = uDirLight.mSpecColor * pow(max(0.0, dot(R, V)), uSpecPower); 56 Phong += Diffuse + Specular; 57 } 58 59 60 61 fragment = texture(uImage,vUV) * vec4(Phong, 1.0f); 62}
glsl
1/*######################################################################### 2# フォング 頂点シェーダー 3###########################################################################*/ 4#version 330 5#extension GL_ARB_explicit_attrib_location: enable 6 7 8 9 10// ###################### 頂点属性 ###################### 11layout(location = 0) in vec3 vertexPosition; //座標 12layout(location = 1) in vec2 vertexUV; //UV座標 13layout(location = 2) in vec3 vertexNorm; //法線 14 15// ###################### 出力 ###################### 16layout(location = 3) out vec2 vUV; //UV 17layout(location = 4) out vec3 vNorm; //法線 18layout(location = 5) out vec3 vPosition; //座標 19 20// ###################### Unifrom ###################### 21uniform mat4 uScale; //スケール 22uniform mat4 uRotate; //回転 23uniform mat4 uTranslate; //平行移動 24 25uniform mat4 uViewProjection; //ビュープロジェクション行列 26 27 28 29 30void main() 31{ 32 vec4 vertex = vec4(vertexPosition,1.0); //同次元座標 33 mat4 model = uTranslate * uRotate * uScale; //モデル行列 34 gl_Position = (uViewProjection * model) * vertex; //頂点座標 クリップ空間 35 36 37 vNorm = (model * vec4(vertexNorm,0.0)).xyz; //法線 38 39 vPosition = vertex.xyz; 40 vUV = vertexUV; //UV座標 41}
気になっていたのですがあなたの「正しい」・「正解」とは何でしょうか。
やり方自体が1つしかないわけじゃないだろうし、意図した通りに動くのであれば、
他により良いやり方やがあっても、それ自体は「正解」ではないでしょうか。
それとも「意図した通りの動き」がわからないから「正解」がわからないということでしょうか。
> これは実装としてフォンのシェーディングは実装出来ているのでしょうか?
「フォンのシェーディング」がどう動くのかわからないから、
実装できているか判断できない、ということでしょうか。
その平面(に見える)モデルの各頂点の法線がどのように与えられているのか知りませんが,「法線の補間」に意味があるものを与えているんでしょうか?
【仮に,全頂点の法線が同じ向きなのだとしたら】平面上での色の変化をもたらす要素は specular くらいしかなくなると思うので,Phong の結果を見るには向かないんじゃないかと思うけど.