質問編集履歴

7

文章を修正

2022/04/29 07:30

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- 提示画像ですが一枚目は実行時で二枚目は画面を横伸ばしした時の画像ですが画面サイズが変わっても同じように画面の中央に表示させるにはどうすればいいのでしょうか?画面サイズがリサイズされた際に ビューポートのサイズを変更して透視投影行列の行列を画面サイズのアスペクト比に毎フレーム変更を適用しているのですがこれはなぜでしょうか?
1
+ 提示画像ですが一枚目は実行時で二枚目は画面を横伸ばしした時の画像ですが画面サイズが変わっても同じように画面の中央に表示させるにはどうすればいいのでしょうか?画面サイズがリサイズされた際に ビューポートのサイズを変更して透視投影行列の行列を画面サイズのアスペクト比に毎フレーム変更を適用しているのですがこれはなぜでしょうか?カスタムフレームバッファを利用しています。
2
2
 
3
3
 
4
4
  ソースファイル全文:https://29.gigafile.nu/0501-d7dcf96b048a4eb8c01e1935fd44736de
@@ -8,6 +8,7 @@
8
8
  1,リサイズイベントを実装しています。
9
9
  2,ビューポートで画面サイズを変更した際に再設定しています。
10
10
  3,画面サイズがリサイズされた際に ビューポートのサイズを変更して透視投影行列の行列を画面サイズのアスペクト比に毎フレーム変更を適用
11
+ 4,カスタムフレームバッファを利用しています。
11
12
 
12
13
  ##### 参考サイト
13
14
  https://tatsy.github.io/OpenGLCourseJP/window_resize/

6

タイトルを修正

2022/04/29 05:32

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- [OpenGL] 画面サイズを変えると描画位置がおかしくなる原因が知りたい
1
+ [OpenGL] 画面サイズを変えると描画位置がおかしくなる原因が知りたい
test CHANGED
File without changes

5

文章を修正

2022/04/26 02:15

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- [OpenGL] 画面サイズを変えても常にテクスチャ画面の真ん中に来処理を作る方法
1
+ [OpenGL] 画面サイズを変えると描画位置おかしくな原因が知りたい。
test CHANGED
File without changes

4

文章を修正

2022/04/24 08:55

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -48,4 +48,156 @@
48
48
  }
49
49
  ```
50
50
 
51
-
51
+ ##### Sprite.cpp
52
+ ```cpp
53
+
54
+ // ##################################### テクスチャ描画 公開 #####################################
55
+ void FrameWork::RenderGraph(const glm::mat4 view,const glm::vec3 position,const FrameWork::Texture texture)
56
+ {
57
+ FrameWork::sprite->Render(view,position,texture);
58
+ }
59
+
60
+ // ##################################### コンストラクタ #####################################
61
+ FrameWork::Sprite::Sprite() : FrameWork::Transform()
62
+ {
63
+ vao = 0;
64
+ vbo = 0;
65
+
66
+ glGenVertexArrays(1, &vao);
67
+ glGenBuffers(1, &vbo);
68
+
69
+ glBindVertexArray(vao);
70
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
71
+
72
+
73
+ shader = std::make_unique<Shader>();
74
+ shader->Load("Asset/shader/2D/BasicTexture_2D.vert","Asset/shader/2D/BasicTexture_2D.frag");
75
+
76
+ shader->setEnable();
77
+
78
+ glBufferData(GL_ARRAY_BUFFER, vertex.size() * sizeof(VertexAttribute), (float*)vertex.data(), GL_DYNAMIC_DRAW);
79
+
80
+ GLuint attrib = shader->getAttribLocation("vertexPosition");
81
+ glEnableVertexAttribArray(attrib);
82
+ glVertexAttribPointer(attrib, 3, GL_FLOAT, GL_FALSE, (sizeof(VertexAttribute) / sizeof(float)) * sizeof(float), (GLvoid*)(sizeof(GLfloat) * 0));
83
+ shader->setBindAttribLocation("vertexPosition");
84
+
85
+ attrib = shader->getAttribLocation("vertexUV");
86
+ glEnableVertexAttribArray(attrib);
87
+ glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, (sizeof(VertexAttribute) / sizeof(float)) * sizeof(float), (GLvoid*)(sizeof(GLfloat) * 3));
88
+ shader->setBindAttribLocation("vertexUV");
89
+
90
+ shader->setDisable();
91
+ glBindVertexArray(0);
92
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
93
+
94
+
95
+ }
96
+
97
+ // ##################################### テクスチャ描画 #####################################
98
+ void FrameWork::Sprite::Render(const glm::mat4 view,const glm::vec3 position,const FrameWork::Texture texture)
99
+ {
100
+ shader->setEnable();
101
+ glm::vec2 screenSize = glm::vec2(1.0f / FrameWork::currentWindow->getSize().x,1.0f / FrameWork::currentWindow->getSize().y);
102
+ glBindVertexArray(vao);
103
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
104
+
105
+ setSize(glm::ivec2(0,0),texture.size);
106
+ setUV(glm::ivec2(0,0),texture.size,texture.size);
107
+
108
+ glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexAttribute) * vertex.size(), vertex.data());
109
+
110
+ Transform::setPosition(glm::vec3(screenSize.x * position.x,screenSize.y * position.y,0));
111
+ Transform::setPosition(glm::vec3(position.x,position.y,0));
112
+ Transform::setRotate(glm::vec3(0, 0, 1), 0);
113
+ Transform::setScale(glm::vec3(texture.size,1));
114
+
115
+ shader->setUniformSampler2D("uImage",0,texture.ID);
116
+ shader->setUniformMatrix4fv("uTranslate", Transform::getMatTranslation());
117
+ shader->setUniformMatrix4fv("uRotate", Transform::getMatRotate());
118
+ shader->setUniformMatrix4fv("uScale", Transform::getMatScale());
119
+ shader->setUniformMatrix4fv("uViewProjection", view);
120
+
121
+ glDrawArrays(GL_TRIANGLES,0,vertex.size());
122
+
123
+ glBindVertexArray(0);
124
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
125
+ shader->setDisable();
126
+
127
+ }
128
+
129
+ // ##################################### 頂点 #####################################
130
+ void FrameWork::Sprite::setSize(const glm::vec2 startSize,const glm::vec2 endSize)
131
+ {
132
+
133
+ glm::vec2 scr = glm::ivec2(1,1);
134
+ scr.x = 1.0f/ 2.0f;
135
+ scr.y = 1.0f/ 2.0f;
136
+
137
+ // 頂点座標
138
+ vertex[0].position.x = -scr.x;
139
+ vertex[0].position.y = scr.y;
140
+ vertex[0].position.z = 0;
141
+
142
+ vertex[1].position.x = -scr.x;
143
+ vertex[1].position.y = -scr.y;
144
+ vertex[1].position.z = 0;
145
+
146
+ vertex[2].position.x = scr.x;
147
+ vertex[2].position.y = scr.y;
148
+ vertex[2].position.z = 0;
149
+
150
+ vertex[3].position.x = scr.x;
151
+ vertex[3].position.y = scr.y;
152
+ vertex[3].position.z = 0;
153
+
154
+ vertex[4].position.x = -scr.x;
155
+ vertex[4].position.y = -scr.y;
156
+ vertex[4].position.z = 0;
157
+
158
+ vertex[5].position.x = scr.x;
159
+ vertex[5].position.y = -scr.y;
160
+ vertex[5].position.z = 0;
161
+
162
+
163
+ }
164
+
165
+
166
+
167
+
168
+ // ##################################### 頂点 #####################################
169
+ void FrameWork::Sprite::setUV(const glm::vec2 startSize, const glm::vec2 endSize,const glm::ivec2 textureSize)
170
+ {
171
+ glm::vec2 size = endSize - startSize;
172
+
173
+
174
+ //UV座標
175
+ float sizeX = 1.0f / (float)textureSize.x;
176
+ float sizeY = 1.0f / (float)textureSize.y;
177
+
178
+ FrameWork::Sprite::vertex[0].uv.x = sizeX * startSize.x;
179
+ FrameWork::Sprite::vertex[0].uv.y = sizeY * startSize.y;
180
+
181
+ FrameWork::Sprite::vertex[1].uv.x = sizeX * startSize.x;
182
+ FrameWork::Sprite::vertex[1].uv.y = sizeY * endSize.y;
183
+
184
+ FrameWork::Sprite::vertex[2].uv.x = sizeX * endSize.x;
185
+ FrameWork::Sprite::vertex[2].uv.y = sizeY * startSize.y;
186
+
187
+ FrameWork::Sprite::vertex[3].uv.x = sizeX * endSize.x;
188
+ FrameWork::Sprite::vertex[3].uv.y = sizeY * startSize.y;
189
+
190
+ FrameWork::Sprite::vertex[4].uv.x = sizeX * startSize.x;
191
+ FrameWork::Sprite::vertex[4].uv.y = sizeY * endSize.y;
192
+
193
+ FrameWork::Sprite::vertex[5].uv.x = sizeX * endSize.x;
194
+ FrameWork::Sprite::vertex[5].uv.y = sizeY * endSize.y;
195
+ }
196
+
197
+
198
+ FrameWork::Sprite::~Sprite()
199
+ {
200
+
201
+ }
202
+ ```
203
+

3

文章を修正

2022/04/24 02:50

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,8 @@
1
1
  提示画像ですが一枚目は実行時で二枚目は画面を横伸ばしした時の画像ですが画面サイズが変わっても同じように画面の中央に表示させるにはどうすればいいのでしょうか?画面サイズがリサイズされた際に ビューポートのサイズを変更して透視投影行列の行列を画面サイズのアスペクト比に毎フレーム変更を適用しているのですがこれはなぜでしょうか?
2
+
3
+
4
+ ソースファイル全文:https://29.gigafile.nu/0501-d7dcf96b048a4eb8c01e1935fd44736de
5
+
2
6
 
3
7
  ##### 現状
4
8
  1,リサイズイベントを実装しています。

2

文章を修正

2022/04/24 02:36

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,10 @@
1
1
  提示画像ですが一枚目は実行時で二枚目は画面を横伸ばしした時の画像ですが画面サイズが変わっても同じように画面の中央に表示させるにはどうすればいいのでしょうか?画面サイズがリサイズされた際に ビューポートのサイズを変更して透視投影行列の行列を画面サイズのアスペクト比に毎フレーム変更を適用しているのですがこれはなぜでしょうか?
2
2
 
3
3
  ##### 現状
4
- リサイズイベントを実装しています。
4
+ 1,リサイズイベントを実装しています。
5
- ビューポートで画面サイズを変更した際に再設定しています。
5
+ 2,ビューポートで画面サイズを変更した際に再設定しています。
6
+ 3,画面サイズがリサイズされた際に ビューポートのサイズを変更して透視投影行列の行列を画面サイズのアスペクト比に毎フレーム変更を適用
7
+
6
8
  ##### 参考サイト
7
9
  https://tatsy.github.io/OpenGLCourseJP/window_resize/
8
10
 
@@ -26,8 +28,8 @@
26
28
 
27
29
  if (instance != NULL)
28
30
  {
29
- instance->size.x = (GLfloat)width;
31
+ instance->size.x = (GLfloat)fbWidth;
30
- instance->size.y = (GLfloat)height;
32
+ instance->size.y = (GLfloat)fbHeight;
31
33
  }
32
34
  }
33
35
 

1

文章を修正

2022/04/24 02:33

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- 提示画像ですが一枚目は実行時で二枚目は画面を横伸ばしした時の画像ですが画面サイズが変わっても同じように画面の中央に表示させるにはどうすればいいのでしょうか?
1
+ 提示画像ですが一枚目は実行時で二枚目は画面を横伸ばしした時の画像ですが画面サイズが変わっても同じように画面の中央に表示させるにはどうすればいいのでしょうか?画面サイズがリサイズされた際に ビューポートのサイズを変更して透視投影行列の行列を画面サイズのアスペクト比に毎フレーム変更を適用しているのですがこれはなぜでしょうか?
2
2
 
3
3
  ##### 現状
4
4
  リサイズイベントを実装しています。
@@ -32,3 +32,14 @@
32
32
  }
33
33
 
34
34
  ```
35
+ ##### Camera.cpp
36
+ ```cpp
37
+ //一部抜粋
38
+ // ##################################### 透視投影行列 #####################################
39
+ glm::mat4 FrameWork::Camera::getViewPerspective()
40
+ {
41
+ return glm::perspective(glm::radians(90.0f), ((float)currentWindow->getSize().x / (float)currentWindow->getSize().y), 0.1f, 1000.0f) * view;
42
+ }
43
+ ```
44
+
45
+