質問編集履歴

1

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

2020/11/24 11:06

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- GLSLでシェーディングが出来ない理由が知りたい。画面表示とは別なのか?それとも平行光源の設定いのか?
1
+ GLSL 平行光源の当たり方おかしいのか?正しいのか知りたい。
test CHANGED
@@ -1,18 +1,12 @@
1
- 提示コードですがフォンのシェーディング実装したいです。
2
-
3
-
4
-
5
- 質問1 [シェーダープログラムですが 画面表示と。フォングシェーディング2つのシェーダープログラムを設定してアクティブにすると思いますがこれはフォングのシェーディング用のシェーダープログラムを有効にするだけでいいのでしょうか? 画面を描画するだけのシェーダープログラムを有効にする必要があるのでしょうか? Draw()関数内 ->Active();関数]
6
-
7
-
8
-
9
- 質問2 「提示コードのCreateDrawMatriex();関数内の平行光源の構造体やその他を設定して部分ですがこの設定正しいのでしょうか?画面に陰影が表示さないためシェーダーコードバグも以外にもこの値をの設定にも題があると思うのすが」
1
+ 提示画像ですが平行光源を使ったフォング反射モデルですが黒い部分は光当たっていない面の色だと思うのですがこシェーダーが間違えてるためバグなのでしょうか?平行光源の向きを画面に表示させるには難易度が高すぎて出来ないの問でしました。
10
-
11
-
12
-
2
+
3
+
4
+
5
+
6
+
7
+
8
+
13
- 質問3「陰陰が表示されないのですが シェダープログラムが間違えているのでしょうか?何度確認しても間違えがわかりません。」
9
+ ![イメジ説明](c58c36de1c6e85c9f8e48594378264d4.png)
14
-
15
-
16
10
 
17
11
 
18
12
 
@@ -20,378 +14,218 @@
20
14
 
21
15
  ```CPP
22
16
 
23
-
17
+ /*****************************************************************************************************************
18
+
24
-
19
+ * ライティング  .vert
20
+
21
+ ******************************************************************************************************************/
22
+
23
+
24
+
25
+ #version 400
26
+
27
+
28
+
29
+ //************ layout
30
+
31
+ layout(location = 0) in vec3 in_Position; //頂点座標
32
+
33
+ layout(location = 1) in vec2 in_TexCoord; //テクスチャ座標
34
+
35
+ layout(location = 2) in vec3 in_Normal; //法線
36
+
37
+
38
+
39
+ //************ uniform
40
+
41
+ uniform mat4 worldMatrix; //ワールド行列
42
+
43
+ uniform mat4 viewMatrix; //ビュー行列
44
+
45
+
46
+
47
+ //************ フラグメントの送る
48
+
49
+ out vec2 fragTexCoord; //UV
50
+
51
+ out vec3 fragNormal; //法線
52
+
53
+ out vec3 fragWorldPos; //ワールド空間(位置)
54
+
55
+
56
+
57
+ ///////////////////////////////////////////////////////
58
+
59
+ void main()
60
+
61
+ {
62
+
63
+ //同次元座標に変換してワールド座標に変換
64
+
65
+ vec4 pos = vec4(in_Position, 1.0);
66
+
67
+ pos = worldMatrix * pos;
68
+
69
+ fragWorldPos = pos.xyz;
70
+
71
+
72
+
73
+
74
+
75
+ vec4 p = vec4(in_Position, 1.0);
76
+
77
+ gl_Position = viewMatrix * pos;
78
+
79
+
80
+
81
+ //fragNormal = (vec4(inNormal, 0.0f) * worldMatrix).xyz;
82
+
83
+ fragNormal = in_Normal;
84
+
85
+
86
+
87
+ fragTexCoord = in_TexCoord;
88
+
89
+ }
90
+
91
+ ///////////////////////////////////////////////////////
92
+
93
+
94
+
95
+ ```
96
+
97
+
98
+
99
+ ```CPP
100
+
101
+ /*****************************************************************************************************************
102
+
103
+ * ライティング  .frag
104
+
105
+ ******************************************************************************************************************/
106
+
107
+ #version 400
108
+
109
+
110
+
25
- //描画
111
+ //並行光源用の構造体
26
-
112
+
27
- void Mesh::Draw()
113
+ struct DirectionalLight
28
114
 
29
115
  {
30
116
 
31
-
32
-
33
- // sh_basic_draw->Active(); //画面描画
34
-
35
- sh_Phong_draw->Active(); //フォングシェーディング
117
+ vec3 mDirection; //方向
36
-
37
-
38
-
39
- CreateDrawMatrix();
118
+
40
-
41
-
42
-
43
- glBindVertexArray(vao);
44
-
45
- glBindTexture(GL_TEXTURE_2D, TextureID);
119
+ vec3 mDiffuseColor; //拡散反射色
46
-
120
+
47
- glDrawElements(GL_TRIANGLES, (GLsizei)index.size(), GL_UNSIGNED_INT, NULL);
121
+ vec3 mSpecColor; //鏡面反射色
48
122
 
49
123
  };
50
124
 
125
+
126
+
127
+ //************ .vertexから来た
128
+
129
+ in vec2 fragTexCoord; //UV
130
+
131
+ in vec3 fragNormal; //法線
132
+
133
+ in vec3 fragWorldPos; //ワールド空間(位置)
134
+
135
+
136
+
137
+ //************ uniform
138
+
139
+ uniform sampler2D uTexture; //テクスチャ画像
140
+
141
+
142
+
143
+ uniform vec3 CameraPos; //カメラ位置
144
+
145
+ uniform vec3 AmbientLight; //環境光の強さ
146
+
147
+ uniform float SpecPower; //表面の鏡反射指数
148
+
149
+
150
+
151
+ uniform DirectionalLight DirLight; //平行光源
152
+
153
+
154
+
155
+ //************ 画面に出力
156
+
157
+ out vec4 out_color; //色
158
+
159
+
160
+
161
+ ///////////////////////////////////////////////////////
162
+
163
+ void main()
164
+
165
+ {
166
+
167
+ //表面法線 N
168
+
169
+ //vec3 N = normalize(fragNormal);
170
+
171
+ vec3 N = fragNormal;
172
+
173
+
174
+
175
+ //表面から光源へのベクトル L
176
+
177
+ vec3 L = normalize(-DirLight.mDirection);
178
+
179
+
180
+
181
+ //表面からカメラへのベクトル V
182
+
183
+ vec3 V = normalize(CameraPos - fragWorldPos);
184
+
185
+
186
+
187
+ //Nに関する -L の反射 R
188
+
189
+ vec3 R = normalize(reflect(-L, N));
190
+
191
+
192
+
193
+ //フォンの反射を計算する
194
+
195
+ vec3 Phong = AmbientLight;
196
+
197
+ float NdotL = dot(N, L);
198
+
199
+ if (NdotL >= 0)
200
+
201
+ {
202
+
203
+ vec3 Diffuse = DirLight.mDiffuseColor * NdotL;
204
+
205
+ vec3 Specular = DirLight.mSpecColor * pow(max(0.0, dot(R, V)), SpecPower);
206
+
207
+ Phong += Diffuse + Specular;
208
+
209
+ }
210
+
211
+
212
+
213
+ //最終的な色はテクスチャの色 x フォンの光(alpha = 1)
214
+
215
+
216
+
217
+ out_color = texture(uTexture, fragTexCoord) * vec4(Phong, 1.0);
218
+
219
+
220
+
221
+ // out_color = texture(uTexture, fragTexCoord);
222
+
223
+
224
+
225
+ }
226
+
227
+ ///////////////////////////////////////////////////////
228
+
229
+
230
+
51
231
  ```
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
- ```.cpp
60
-
61
-
62
-
63
- //3D空間をシュミレートするための行列を計算
64
-
65
- void Mesh::CreateDrawMatrix()
66
-
67
- {
68
-
69
-
70
-
71
- //ワールド行列
72
-
73
- glm::mat4 worldMatrix = getMove() * getScale() * getRotate();
74
-
75
-
76
-
77
-
78
-
79
- //画面描画
80
-
81
- sh_basic_draw->SetFloatUniform_4m("worldMatrix", worldMatrix);
82
-
83
- sh_basic_draw->SetFloatUniform_4m("viewMatrix", Onwer->camera->getViewMatrix());
84
-
85
-
86
-
87
-
88
-
89
-
90
-
91
-
92
-
93
- //ライティング描画
94
-
95
-
96
-
97
- //.vert
98
-
99
- sh_Phong_draw->SetFloatUniform_4m("worldMatrix", worldMatrix);
100
-
101
- sh_Phong_draw->SetFloatUniform_4m("viewMatrix", Onwer->camera->getViewMatrix());
102
-
103
-
104
-
105
- //.frag
106
-
107
- //並行光源用の構造体
108
-
109
- struct DirectionLight
110
-
111
- {
112
-
113
- glm::vec3 mDirection; //光の方向
114
-
115
- glm::vec3 mDiffuseColor; //拡散反射色
116
-
117
- glm::vec3 mSpecColor; //鏡反射色
118
-
119
- };
120
-
121
-
122
-
123
- struct DirectionLight mDirLight;
124
-
125
- mDirLight.mDirection = glm::vec3(0, -0.7, -0.7);
126
-
127
- mDirLight.mDiffuseColor = glm::vec3(0, 1, 0);
128
-
129
- mDirLight.mSpecColor = glm::vec3(0.5, 1, 0.5);
130
-
131
-
132
-
133
- glm::vec3 mAmbientLight = glm::vec3(8.1,8.1,8.1);//環境光の強さ
134
-
135
-
136
-
137
- sh_Phong_draw->SetFloatUniform_1f("SpecPower;",10);//
138
-
139
-
140
-
141
- sh_Phong_draw->SetFloatUniform_3f("CameraPos", Onwer->camera->getPosition());// カメラ位置(ワールド)
142
-
143
-
144
-
145
- sh_Phong_draw->SetFloatUniform_3f("AmbientLight", mAmbientLight);// 環境光の強さ
146
-
147
-
148
-
149
- sh_Phong_draw->SetFloatUniform_3f("DirLight.mDirection", mDirLight.mDirection);//光の方向
150
-
151
-
152
-
153
- sh_Phong_draw->SetFloatUniform_3f("DirLight.mDiffuseColor", mDirLight.mDiffuseColor);//拡散反射色
154
-
155
-
156
-
157
- sh_Phong_draw->SetFloatUniform_3f("DirLight.mSpecColor", mDirLight.mSpecColor);//鏡反射色
158
-
159
- }
160
-
161
-
162
-
163
-
164
-
165
- ```
166
-
167
-
168
-
169
- ```GLSL
170
-
171
- /*****************************************************************************************************************
172
-
173
- * ライティング  .vert
174
-
175
- ******************************************************************************************************************/
176
-
177
- #version 400
178
-
179
-
180
-
181
-
182
-
183
-
184
-
185
-
186
-
187
- //************ layout
188
-
189
- layout(location = 0) in vec3 in_Position; //頂点座標
190
-
191
- layout(location = 1) in vec2 in_TexCoord; //テクスチャ座標
192
-
193
- layout(location = 2) in vec3 in_Normal; //法線
194
-
195
-
196
-
197
- //************ uniform
198
-
199
- uniform mat4 worldMatrix; //ワールド行列
200
-
201
- uniform mat4 viewMatrix; //ビュー行列
202
-
203
-
204
-
205
- //************ フラグメントの送る
206
-
207
- out vec2 fragTexCoord; //UV
208
-
209
- out vec3 fragNormal; //法線
210
-
211
- out vec3 fragWorldPos; //ワールド空間(位置)
212
-
213
-
214
-
215
- ///////////////////////////////////////////////////////
216
-
217
- void main()
218
-
219
- {
220
-
221
-
222
-
223
- vec4 pos = vec4(in_Position, 1.0);
224
-
225
- pos = pos * worldMatrix;
226
-
227
- fragWorldPos = pos.xyz;
228
-
229
-
230
-
231
-
232
-
233
- gl_Position = pos * viewMatrix;
234
-
235
-
236
-
237
- fragNormal = (vec4(in_Normal, 0.0f) * worldMatrix).xyz;
238
-
239
-
240
-
241
- fragTexCoord = in_TexCoord;
242
-
243
- }
244
-
245
- ///////////////////////////////////////////////////////
246
-
247
-
248
-
249
- ```/////////
250
-
251
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
252
-
253
- ```GLSL
254
-
255
- /*****************************************************************************************************************
256
-
257
- * ライティング  .frag
258
-
259
- ******************************************************************************************************************/
260
-
261
- #version 400
262
-
263
-
264
-
265
-
266
-
267
-
268
-
269
- //並行光源用の構造体
270
-
271
- struct DirectionalLight
272
-
273
- {
274
-
275
- vec3 mDirection; //光の方向
276
-
277
- vec3 mDiffuseColor; //拡散反射色
278
-
279
- vec3 mSpecColor; //鏡面反射色
280
-
281
- };
282
-
283
-
284
-
285
-
286
-
287
- //************ .vertexから来た
288
-
289
- in vec2 fragTexCoord; //UV
290
-
291
- in vec3 fragNormal; //法線
292
-
293
- in vec3 fragWorldPos; //ワールド空間(位置)
294
-
295
-
296
-
297
- //************ uniform
298
-
299
- uniform sampler2D uTexture; //テクスチャ画像
300
-
301
-
302
-
303
- uniform vec3 CameraPos; //カメラ位置
304
-
305
- uniform vec3 AmbientLight; //環境光の強さ
306
-
307
- uniform float SpecPower; //表面の鏡反射指数
308
-
309
-
310
-
311
- uniform DirectionalLight DirLight; //平行光源
312
-
313
-
314
-
315
-
316
-
317
- //************ 画面に出力
318
-
319
- out vec4 out_color; //色
320
-
321
-
322
-
323
-
324
-
325
-
326
-
327
- //ライティング用
328
-
329
- ///////////////////////////////////////////////////////
330
-
331
- void main()
332
-
333
- {
334
-
335
-
336
-
337
-
338
-
339
- //表面法線 N
340
-
341
- vec3 N = normalize(fragNormal);
342
-
343
-
344
-
345
- //表面から光源へのベクトル L
346
-
347
- vec3 L = normalize(-DirLight.mDirection);
348
-
349
-
350
-
351
- //表面からカメラへのベクトル V
352
-
353
- vec3 V = normalize(CameraPos - fragWorldPos);
354
-
355
-
356
-
357
- //Nに関する -L の反射 R
358
-
359
- vec3 R = normalize(reflect(-L, N));
360
-
361
-
362
-
363
- //フォンの反射を計算する
364
-
365
- vec3 Phong = AmbientLight;
366
-
367
- float NdotL = dot(N, L);
368
-
369
- if (NdotL > 0)
370
-
371
- {
372
-
373
- vec3 Diffuse = DirLight.mDiffuseColor * NdotL;
374
-
375
- vec3 Specular = DirLight.mSpecColor * pow(max(0.0, dot(R, V)), SpecPower);
376
-
377
- Phong += Diffuse + Specular;
378
-
379
- }
380
-
381
-
382
-
383
- //最終的な色はテクスチャの色 x フォンの光(alpha = 1)
384
-
385
- out_color = texture(uTexture, fragTexCoord) * vec4(Phong, 1.0f);
386
-
387
-
388
-
389
- // out_color = texture(uTexture,fragTexCoord);
390
-
391
- }
392
-
393
- ///////////////////////////////////////////////////////
394
-
395
-
396
-
397
- ```