teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

文章とタイトルを編集しました。

2020/11/24 11:06

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- GLSLでシェーディングが出来ない理由が知りたい。画面表示とは別なのか?それとも平行光源の設定いのか?
1
+ GLSL 平行光源の当たり方おかしいのか?正しいのか知りたい。
body CHANGED
@@ -1,96 +1,17 @@
1
- 提示コードですがフォンのシェーディン実装いで
1
+ 提示画像ですが平行光源を使ったフォン反射モデルですが黒い部分は光当たっていない面の色だと思うのですがこれはシェーダーが間違えているためのバなのでょうか?平行光源の向きを画面に表示させるには難易度が高すぎて出来なの質問しました
2
2
 
3
- 質問1 [シェーダープログラムですが 画面表示と。フォングシェーディング2つのシェーダープログラムを設定してアクティブにすると思いますがこれはフォングのシェーディング用のシェーダープログラムを有効にするだけでいいのでしょうか? 画面を描画するだけのシェーダープログラムを有効にする必要があるのでしょうか? Draw()関数内 ->Active();関数]
4
3
 
5
- 質問2 「提示コードのCreateDrawMatriex();関数内の平行光源の構造体やその他を設定している部分ですがこの設定は正しいのでしょうか?画面に陰影が表示されないためシェーダーコードのバグも以外にもこの値をの設定にも問題があると思うのですが」
6
4
 
7
- 質問3「陰陰が表示されないのですが シェダープログラムが間違えているのでしょうか?何度確認しても間違えがわかりません。」
5
+ ![イメジ説明](c58c36de1c6e85c9f8e48594378264d4.png)
8
6
 
9
7
 
10
-
11
8
  ```CPP
12
-
13
- //描画
14
- void Mesh::Draw()
15
- {
16
-
17
- // sh_basic_draw->Active(); //画面描画
18
- sh_Phong_draw->Active(); //フォングのシェーディング
19
-
20
- CreateDrawMatrix();
21
-
22
- glBindVertexArray(vao);
23
- glBindTexture(GL_TEXTURE_2D, TextureID);
24
- glDrawElements(GL_TRIANGLES, (GLsizei)index.size(), GL_UNSIGNED_INT, NULL);
25
- };
26
- ```
27
-
28
-
29
-
30
- ```.cpp
31
-
32
- //3D空間をシュミレートするための行列を計算
33
- void Mesh::CreateDrawMatrix()
34
- {
35
-
36
- //ワールド行列
37
- glm::mat4 worldMatrix = getMove() * getScale() * getRotate();
38
-
39
-
40
- //画面描画
41
- sh_basic_draw->SetFloatUniform_4m("worldMatrix", worldMatrix);
42
- sh_basic_draw->SetFloatUniform_4m("viewMatrix", Onwer->camera->getViewMatrix());
43
-
44
-
45
-
46
-
47
- //ライティング描画
48
-
49
- //.vert
50
- sh_Phong_draw->SetFloatUniform_4m("worldMatrix", worldMatrix);
51
- sh_Phong_draw->SetFloatUniform_4m("viewMatrix", Onwer->camera->getViewMatrix());
52
-
53
- //.frag
54
- //並行光源用の構造体
55
- struct DirectionLight
56
- {
57
- glm::vec3 mDirection; //光の方向
58
- glm::vec3 mDiffuseColor; //拡散反射色
59
- glm::vec3 mSpecColor; //鏡反射色
60
- };
61
-
62
- struct DirectionLight mDirLight;
63
- mDirLight.mDirection = glm::vec3(0, -0.7, -0.7);
64
- mDirLight.mDiffuseColor = glm::vec3(0, 1, 0);
65
- mDirLight.mSpecColor = glm::vec3(0.5, 1, 0.5);
66
-
67
- glm::vec3 mAmbientLight = glm::vec3(8.1,8.1,8.1);//環境光の強さ
68
-
69
- sh_Phong_draw->SetFloatUniform_1f("SpecPower;",10);//
70
-
71
- sh_Phong_draw->SetFloatUniform_3f("CameraPos", Onwer->camera->getPosition());// カメラ位置(ワールド)
72
-
73
- sh_Phong_draw->SetFloatUniform_3f("AmbientLight", mAmbientLight);// 環境光の強さ
74
-
75
- sh_Phong_draw->SetFloatUniform_3f("DirLight.mDirection", mDirLight.mDirection);//光の方向
76
-
77
- sh_Phong_draw->SetFloatUniform_3f("DirLight.mDiffuseColor", mDirLight.mDiffuseColor);//拡散反射色
78
-
79
- sh_Phong_draw->SetFloatUniform_3f("DirLight.mSpecColor", mDirLight.mSpecColor);//鏡反射色
80
- }
81
-
82
-
83
- ```
84
-
85
- ```GLSL
86
9
  /*****************************************************************************************************************
87
10
  * ライティング  .vert
88
11
  ******************************************************************************************************************/
12
+
89
13
  #version 400
90
14
 
91
-
92
-
93
-
94
15
  //************ layout
95
16
  layout(location = 0) in vec3 in_Position; //頂点座標
96
17
  layout(location = 1) in vec2 in_TexCoord; //テクスチャ座標
@@ -108,30 +29,30 @@
108
29
  ///////////////////////////////////////////////////////
109
30
  void main()
110
31
  {
111
-
32
+ //同次元座標に変換してワールド座標に変換
112
33
  vec4 pos = vec4(in_Position, 1.0);
113
- pos = pos * worldMatrix;
34
+ pos = worldMatrix * pos;
114
35
  fragWorldPos = pos.xyz;
115
36
 
116
37
 
38
+ vec4 p = vec4(in_Position, 1.0);
117
- gl_Position = pos * viewMatrix;
39
+ gl_Position = viewMatrix * pos;
40
+
41
+ //fragNormal = (vec4(inNormal, 0.0f) * worldMatrix).xyz;
42
+ fragNormal = in_Normal;
118
43
 
119
- fragNormal = (vec4(in_Normal, 0.0f) * worldMatrix).xyz;
120
-
121
44
  fragTexCoord = in_TexCoord;
122
45
  }
123
46
  ///////////////////////////////////////////////////////
124
47
 
125
- ```/////////
48
+ ```
126
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
49
+
127
- ```GLSL
50
+ ```CPP
128
51
  /*****************************************************************************************************************
129
52
  * ライティング  .frag
130
53
  ******************************************************************************************************************/
131
54
  #version 400
132
55
 
133
-
134
-
135
56
  //並行光源用の構造体
136
57
  struct DirectionalLight
137
58
  {
@@ -140,7 +61,6 @@
140
61
  vec3 mSpecColor; //鏡面反射色
141
62
  };
142
63
 
143
-
144
64
  //************ .vertexから来た
145
65
  in vec2 fragTexCoord; //UV
146
66
  in vec3 fragNormal; //法線
@@ -155,20 +75,15 @@
155
75
 
156
76
  uniform DirectionalLight DirLight; //平行光源
157
77
 
158
-
159
78
  //************ 画面に出力
160
79
  out vec4 out_color; //色
161
80
 
162
-
163
-
164
- //ライティング用
165
81
  ///////////////////////////////////////////////////////
166
82
  void main()
167
83
  {
168
-
169
-
170
84
  //表面法線 N
171
- vec3 N = normalize(fragNormal);
85
+ //vec3 N = normalize(fragNormal);
86
+ vec3 N = fragNormal;
172
87
 
173
88
  //表面から光源へのベクトル L
174
89
  vec3 L = normalize(-DirLight.mDirection);
@@ -182,7 +97,7 @@
182
97
  //フォンの反射を計算する
183
98
  vec3 Phong = AmbientLight;
184
99
  float NdotL = dot(N, L);
185
- if (NdotL > 0)
100
+ if (NdotL >= 0)
186
101
  {
187
102
  vec3 Diffuse = DirLight.mDiffuseColor * NdotL;
188
103
  vec3 Specular = DirLight.mSpecColor * pow(max(0.0, dot(R, V)), SpecPower);
@@ -190,9 +105,11 @@
190
105
  }
191
106
 
192
107
  //最終的な色はテクスチャの色 x フォンの光(alpha = 1)
193
- out_color = texture(uTexture, fragTexCoord) * vec4(Phong, 1.0f);
194
108
 
109
+ out_color = texture(uTexture, fragTexCoord) * vec4(Phong, 1.0);
110
+
195
- // out_color = texture(uTexture,fragTexCoord);
111
+ // out_color = texture(uTexture, fragTexCoord);
112
+
196
113
  }
197
114
  ///////////////////////////////////////////////////////
198
115