質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

Q&A

1回答

990閲覧

フォンのシェーディングの実装が正しいのかどうか知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

0グッド

0クリップ

投稿2021/06/13 03:08

編集2021/06/15 01:51

提示コードですがこれはフォンのシェーディングとして正しいのでしょうか?方向を触ると光沢は出ないのですが光の当たり方で明暗が分かれるのですがこれは実装としてフォンのシェーディングは実装出来ているのでしょうか? 

※提示画像のようにフォンのシェーディングの光沢が出ません。

提示画像の左上の数値は光の方向です。

イメージ説明
イメージ説明

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/14 23:41

気になっていたのですがあなたの「正しい」・「正解」とは何でしょうか。 やり方自体が1つしかないわけじゃないだろうし、意図した通りに動くのであれば、 他により良いやり方やがあっても、それ自体は「正解」ではないでしょうか。 それとも「意図した通りの動き」がわからないから「正解」がわからないということでしょうか。
退会済みユーザー

退会済みユーザー

2021/06/15 01:43

> これは実装としてフォンのシェーディングは実装出来ているのでしょうか? 「フォンのシェーディング」がどう動くのかわからないから、 実装できているか判断できない、ということでしょうか。
fana

2021/06/15 02:07

その平面(に見える)モデルの各頂点の法線がどのように与えられているのか知りませんが,「法線の補間」に意味があるものを与えているんでしょうか? 【仮に,全頂点の法線が同じ向きなのだとしたら】平面上での色の変化をもたらす要素は specular くらいしかなくなると思うので,Phong の結果を見るには向かないんじゃないかと思うけど.
guest

回答1

0

なにはともあれ,
シェーディングの結果を確認したいときにわざわざ余計なテクスチャを混ぜ込まないだろ常考…
とか思うわけだが……


とりあえず,バーテックスシェーダの

vNorm = (model * vec4(vertexNorm,0.0)).xyz; //法線

字面から,個人的には「まぁ,ダメだろうな」と想像しますが,あなたのプログラム全体で見ればそれが妥当なのだ!という可能性もないわけではない(modelとかvertexNormの値とかも外野にはわからないしね)でしょうから,正当性はきちんとご自身でチェックすべきです.


というわけで,ここでは正当性のチェック方法について述べますが,

「正しいか否か」をチェックしたいならば,理論値と出力結果とを比較すればいいです.

レンダリング結果のスクショが取れているようですから,各画素の最終結果の色は(手作業ででも)調べることができるわけですよね.

他方,実装した(ハズの)理屈(数式)も存在しているのですから,
「結果の色に影響を与えるハズのパラメータ群の値を{a,b,c,d,...}にしたらならば,ある箇所の色はこうなるハズ」という理論値は紙上で計算できるハズです.

なので,両者を比較してみればよい.
様々なパターンで比較を行い,そのすべてが満足のいく比較結果であれば(少なくともその範囲で使う限りは)「正しい」と見なすことができるでしょう.

同様に,
「あるパラメータ値を変化させていったら,この箇所の色はこのような変動になる」という話があるなら,「パラメータ値 vs 色」のデータを取って確認しましょう.
グラフでもプロットしてみてれば,その見た目からざっくりと判断できるかもしれません.

とにかく,動作結果だけを見ても「まともか否か」の判断が付かないならば,そういう確認作業を実際に行ってください


確認する場合,{ ambient, diffuse, specular }の複合した結果を見るのは面倒でしょうから,個別にチェックすることを勧めます.
(こいつらは最終的に単純に加算されているだけなので,個々の振る舞いを独立して見れる)

例えば,

  • フラグメントシェーダの出力を(ambient と specular は無視して) diffuse 要素だけにして見る

とかすれば,少なくとも diffuse の計算と,それが用いている各要素(法線とかね)がまともになっているのか否か? を見ることができるでしょう.

投稿2021/06/15 01:50

編集2021/06/15 01:58
fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問