質問編集履歴
1
文章とタイトルを編集しました。
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
|
-
|
5
|
+

|
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 =
|
34
|
+
pos = worldMatrix * pos;
|
114
35
|
fragWorldPos = pos.xyz;
|
115
36
|
|
116
37
|
|
38
|
+
vec4 p = vec4(in_Position, 1.0);
|
117
|
-
gl_Position =
|
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
|
-
```
|
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
|
-
//
|
111
|
+
// out_color = texture(uTexture, fragTexCoord);
|
112
|
+
|
196
113
|
}
|
197
114
|
///////////////////////////////////////////////////////
|
198
115
|
|