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

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

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

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

C++

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

Q&A

0回答

874閲覧

GLSLにて面法線が欲しい場合頂点属性に面法線を設定するのでしょうか?

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2020/11/23 11:02

シェーダープログラムで面法線が欲しいと言われているので 面法線を頂点属性の法線に設定しているのですがこれは正しいのでしょうか?

cpp

1 2//面法線を計算する 3glm::vec3 SurfaceNormal(glm::vec3 P0, glm::vec3 P1, glm::vec3 P2) 4//glm::vec3 SurfaceNormal(float P1[],float P2[],float P3[]) 5{ 6 glm::vec3 vv1, vv2; 7 8 vv1 = P1 - P0; 9 vv2 = P2 - P1; 10 11 // glm::vec3 r = vv1 * vv2; 12 glm::vec3 r = glm::cross( vv1,vv2); 13 14 glm::normalize(r); 15 //printf("%.2f , %.2f , %.2f \n",r.x,r.y,r.z); 16 return r; 17 18} 19 20//コンストラクタ 21Game::Game() 22{ 23 mIsRunLoop = true; 24 25 srand((unsigned int)time(0)); 26 27 28// printf("%zd",vertex.size());//8ポリゴン 24頂点 29 30 //----------------------- 面 法線を算出 法線を設定 31 //面法線とその面の頂点を入れる構造体 32 struct PolyNorm 33 { 34 glm::vec3 Position[3]; //座標 35 glm::vec3 Norm; //面法線 36 }; 37 38 39 40 41 //------------------------------ 面法線を各頂点属性に設定 42 PolyNorm polygon; 43 44 45 46 //-------------------------------------------------------------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------------------------------------------------------------- 49 50 polygon.Position[0] = glm::vec3(vertex.at(0).Position[0], vertex.at(0).Position[1], vertex.at(0).Position[2]); 51 polygon.Position[1] = glm::vec3(vertex.at(1).Position[0], vertex.at(1).Position[1], vertex.at(1).Position[2]); 52 polygon.Position[2] = glm::vec3(vertex.at(2).Position[0], vertex.at(2).Position[1], vertex.at(2).Position[2]); 53 54 polygon.Norm = SurfaceNormal(polygon.Position[0], polygon.Position[1], polygon.Position[2]); //面法線を算出 55 56 //面法線を所属する頂点に設定 57 vertex.at(0).Normal[0] = polygon.Norm.x; 58 vertex.at(0).Normal[1] = polygon.Norm.y; 59 vertex.at(0).Normal[2] = polygon.Norm.z; 60 61 vertex.at(1).Normal[0] = polygon.Norm.x; 62 vertex.at(1).Normal[1] = polygon.Norm.y; 63 vertex.at(1).Normal[2] = polygon.Norm.z; 64 65 vertex.at(2).Normal[0] = polygon.Norm.x; 66 vertex.at(2).Normal[1] = polygon.Norm.y; 67 vertex.at(2).Normal[2] = polygon.Norm.z; 68 69 //-------------------------------------------------------------------------------------------------------------------------------- 70

シェーダーコード

GLSL

1/***************************************************************************************************************** 2* ライティング  .vert 3******************************************************************************************************************/ 4 5#version 400 6//************ layout 7layout(location = 0) in vec3 in_Position; //頂点座標 8layout(location = 1) in vec2 in_TexCoord; //テクスチャ座標 9layout(location = 2) in vec3 in_Normal; //法線 10 11//************ uniform 12uniform mat4 worldMatrix; //ワールド行列 13uniform mat4 viewMatrix; //ビュー行列 14 15//************ フラグメントの送る 16out vec2 fragTexCoord; //UV 17out vec3 fragNormal; //法線 18out vec3 fragWorldPos; //ワールド空間(位置) 19 20/////////////////////////////////////////////////////// 21void main() 22{ 23 //同次元座標に変換してワールド座標に変換 24 vec4 pos = vec4(in_Position, 1.0); 25 pos = worldMatrix * pos; 26 fragWorldPos = pos.xyz; 27 28 29 vec4 p = vec4(in_Position, 1.0); 30 gl_Position = viewMatrix * pos; 31 32 //fragNormal = (vec4(inNormal, 0.0f) * worldMatrix).xyz; 33 fragNormal = in_Normal; 34 35 fragTexCoord = in_TexCoord; 36} 37/////////////////////////////////////////////////////// 38

GLSL

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 out_color = texture(uTexture, fragTexCoord) * vec4(Phong, 1.0f); 59} 60/////////////////////////////////////////////////////// 61

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問