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

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

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

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

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

Q&A

解決済

1回答

741閲覧

GLSLで画面描画ができない原因が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

0グッド

0クリップ

投稿2020/09/18 09:00

編集2020/09/18 09:32

GLSLのコードをコンソールアプリでデバッグして実証してその結果をGLSLに載せたのですがなぜ画面に何も表示されないのでしょうか?

関数bool Game::LoadShader(const char* VertName,const char* FragName);部の中ですが何も間違えていないと思うのですがOpenGLは初心者で細かい仕組みやライブラリの内容は知りませんしっかりエラーログの出力も行っていますが何もでませんシェーダーは普通に読み込んでると思われるのですがそしたら行列になりますが前回の質問で修正済みのはずです
※言うまでもなく自分でもしっかり確認しました。

以前の質問では実験用にコンソール画面での数値を確認しましたが今回はそれをGLSLに本番環境に持って来たのですが画面に何も描画されません。指摘のあった行列などはしっかり修正してZ軸の値がまともな値が来るようになったのですが今回はなぜ描画されないのでしょうか?

前回の質問: https://teratail.com/questions/292223

Github: https://github.com/Shigurechan/drawshader_bug

GLSL

1#version 400 2//頂点シェーダー 3 4in vec3 position;//頂点座標 5 6uniform mat4 scale;//スケール行列 7uniform mat4 rotate;//回転行列 8uniform mat4 move;//平行移動行列 9 10uniform mat4 MP; 11 12out vec4 mt; 13 14void main() 15{ 16 vec4 t = vec4(position,1.0); 17 mat4 M = mat4(move * rotate * scale); 18 19 gl_Position = MP * M * t; 20 ///gl_Position = vec4(mt,1.0); 21} 22 23

hpp

1 2 3 4class Game 5{ 6public: 7 Vector3 cv; 8 9 Game(); 10 11 bool Initialization(); 12 13 bool RunLoop(); 14 15 void Update(); 16 void GenerateOutput(); 17 18 19private: 20 bool mIsRunLoop;//メインループ 21 22 float mp[16] = { 0 };//透視射形行列 23 24 25 //頂点バッファー 26 float Vertex[6][4] = 27 { 28 {-0.5, 0.5, -1.0, 1.0}, 29 {-0.5, -0.5, -1.0, 1.0}, 30 {0.5, -0.5, -1.0, 1.0}, 31 32 {-0.5, 0.5, -1.0, 1.0}, 33 {0.5, 0.5, -1.0, 1.0 }, 34 {0.5, -0.5, -1.0, 1.0} 35 }; 36 37 //透視投影変換行列を作る 38 void create_matri_mp(float top, float bottom, float left, float right,float near, float far, float result[16]); 39 40 bool LoadShader(const char* VertName, const char* FragName); 41 42 43 //シェーダーを読み込んでコンパイルして適用 44// bool CompileShader(const char *fileName, GLenum type); 45 bool CompileShader(const char* fileName, GLenum type, GLuint out_shader); 46 GLuint vbo = 0;//頂点配列バッファオブジェクト名 47 GLuint vao = 0;//頂点バッファオブジェクト名 48 49 GLFWwindow* Window = nullptr;//OpenGLコンテキスト 50 51 GLuint ShaderProgram;//シェーダープログラム 52 53 54 bool Shader();//シェーダ読み込み 55 void Compile_log(GLuint Shader);//シェーダーコンパイルログ 56 void Link_log(GLuint Shader);//シェーダーリンクログ 57 58 void GetShader_Log(GLuint shader_type,GLuint Log_type);//ログ 59}; 60#endif 61

cpp

1 2 3 4//透視投影変換行列を作る 5void Game::create_matri_mp(float top, float bottom, float left, float right, 6 float near, float far, float result[16]) 7{ 8 9 for (int i = 0; i < 16; i++) 10 { 11 result[i] = 0; 12 } 13 14 result[0] = (2 * near) / (right - left); 15 result[5] = (2 * near) / (top - bottom); 16 17 result[8] = (right + left) / (right - left); 18 19 result[9] = (top + bottom) / (top - bottom); 20 21 result[10] = -(far + near) / (far - near); 22 23 result[11] = -1; 24 result[14] = -(2 * far * near) / (far - near); 25 26 for (int i = 0; i < 16; i++) 27 { 28 // printf("%.2f\n",result[i]); 29 } 30 31} 32 33//コンストラクタ 34Game::Game() 35{ 36 mIsRunLoop = true; 37 38} 39 40//メインループ 41bool Game::RunLoop() 42{ 43 if (mIsRunLoop == true) 44 { 45 Update(); 46 GenerateOutput(); 47 } 48 else { 49 return false; 50 } 51 return true; 52 53} 54 55 56//シェーダー関係のログを取得 57void Game::GetShader_Log(GLuint shader_type, GLuint Log_type) 58{ 59 //割愛 60} 61 62//シェーダー読み込みとコンパイル 63bool Game::CompileShader(const char* fileName, GLenum type,GLuint out_shader) 64{ 65 66 return true; 67 68} 69 70 71//シェーダー読み込み関数 72bool Game::LoadShader(const char* VertName,const char* FragName) 73{ 74 ShaderProgram = glCreateProgram(); 75 GLuint out_vert_shader = glCreateShader(GL_VERTEX_SHADER); 76 GLuint out_frag_shader = glCreateShader(GL_FRAGMENT_SHADER); 77 78 //シェーダーを読み込み 79 std::ifstream shaderfile(VertName); 80 if (shaderfile.is_open()) 81 { 82 std::stringstream sstream; 83 sstream << shaderfile.rdbuf(); 84 std::string str = sstream.str(); 85 const char* cc = str.c_str(); 86 glShaderSource(out_vert_shader, 1, &cc, nullptr); 87 glCompileShader(out_vert_shader); 88 printf("ファイル読み込み成功: %s\n", VertName); 89 GetShader_Log(out_vert_shader, GL_COMPILE_STATUS); 90 glAttachShader(ShaderProgram, out_vert_shader); 91 shaderfile.close(); 92 } 93 else { 94 shaderfile.close(); 95 printf("ファイル: %s が読み込めませんでした。", VertName); 96 } 97 98 //シェーダーを読み込み 99 std::ifstream shaderfile2(FragName); 100 if (shaderfile2.is_open()) 101 { 102 std::stringstream sstream; 103 sstream << shaderfile2.rdbuf(); 104 std::string str = sstream.str(); 105 const char* cc = str.c_str(); 106 glShaderSource(out_frag_shader, 1, &cc, nullptr); 107 glCompileShader(out_frag_shader); 108 printf("ファイル読み込み成功: %s\n", FragName); 109 GetShader_Log(out_frag_shader, GL_COMPILE_STATUS); 110 glAttachShader(ShaderProgram, out_frag_shader); 111 shaderfile2.close(); 112 } 113 else { 114 shaderfile2.close(); 115 printf("ファイル: %s が読み込めませんでした。", FragName); 116 } 117 118 119 120 121 122 123 124 125//////////////////////////////////////////////////////////////////////////////////////////// 126 //座標構造体 127 struct position 128 { 129 public: 130 float x; 131 float y; 132 float z; 133 134 float w; 135 }; 136 137 struct position pos; 138 139 pos.x = 1.0f; 140 pos.y = 0; 141 pos.z = 0; 142 143 pos.w = 1.0f; 144 float r = 0.0f; 145 146 147 float rotate[16] = { 148 (pos.x * pos.x * (1 - cos(r)) + cos(r)), 149 (pos.x * pos.y * (1 - cos(r)) - (pos.z * sin(r))), 150 (pos.x * pos.z * (1 - cos(r)) + (pos.y * sin(r))), 151 0, 152 153 (pos.x * pos.y * (1 - cos(r)) + (pos.z * sin(r))), 154 (pos.y * pos.y * (1 - cos(r)) + cos(r)), 155 (pos.y * pos.z * (1 - cos(r)) - (pos.x * sin(r))), 156 0, 157 158 (pos.x * pos.z * (1 - cos(r)) - (pos.y * sin(r))), 159 (pos.y * pos.z * (1 - cos(r)) + (pos.x * sin(r))), 160 (pos.z * pos.z * (1 - cos(r)) + cos(r)), 161 0, 162 163 0,0,0,1 164 }; 165 166 167 //スケール行列 168 float scale[16] = { 169 1,0,0,0, 170 0,1,0,0, 171 0,0,1,0, 172 0,0,0,1 173 }; 174 175 //平行移動 176 struct position p; 177 p.x = 0; 178 p.y = 0; 179 p.z = 0; 180 p.w = 1; 181 182 float move[16] = 183 { 184 1,0,0,0, 185 0,1,0,0, 186 0,0,1,0, 187 p.x,p.y,p.z,1, 188 }; 189 190 191 192 193 create_matri_mp(1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 10.0f, mp);//透視行列を作成 194 195 196 glBindAttribLocation(ShaderProgram, 0, "Vertex"); 197 198 199 glUniformMatrix4fv(glGetUniformLocation(ShaderProgram, "scale"), 0, GL_TRUE, scale); 200 glUniformMatrix4fv(glGetUniformLocation(ShaderProgram, "rotate"), 0, GL_TRUE, rotate); 201 glUniformMatrix4fv(glGetUniformLocation(ShaderProgram, "move"), 0, GL_TRUE, move); 202 glUniformMatrix4fv(glGetUniformLocation(ShaderProgram, "MP"), 0, GL_TRUE, mp); 203 204 205 206 glLinkProgram(ShaderProgram); 207 glUseProgram(ShaderProgram); 208 209//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 210 211 return true; 212} 213 214//シェーダを実装する 215bool Game::Shader() 216{ 217 return true; 218} 219 220 221//初期化 222bool Game::Initialization() 223{ 224//初期化 関係 225//------------------------------------------------------------------------------------------------------------------------------------------------ 226 //glfwの初期化に失敗 227 if (glfwInit() != GL_TRUE) 228 { 229 printf("glfwInit()失敗\n"); 230 int _c = getchar(); 231 232 return 0; 233 } 234 235 //コンテキストを作成 236 Window = glfwCreateWindow(640, 400, "Hello", NULL, NULL); 237 238 //OpenGLコンテキストの作成に失敗 239 if (Window == NULL) 240 { 241 printf("glfCreateWindow()失敗\n"); 242 int c = getchar(); 243 244 return 0; 245 } 246 247 //コンテキストをOpenGLの描画対象にする。 248 glfwMakeContextCurrent(Window); 249 250 //glewを初期化する。 251 glewExperimental = GL_TRUE; 252 if (glewInit() != GLEW_OK) 253 { 254 printf("glewInit() の初期化に失敗しました。"); 255 return 0; 256 } 257 258 //OpenGLバージョン指定 259 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); 260 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 0); 261 262 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 263 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 264 265 //垂直同期のタイミングを待つ 266 glfwSwapInterval(1); 267 268//------------------------------------------------------------------------------------------------------------------------------------------------ 269 270 271 272 273 if (LoadShader("Basic.vert","Basic.frag") == true)//シェーダーを読み込む 274 { 275 //printf("シェーダーを読み込む\n"); 276 } 277 278 //頂点バッファvboを設定 279 glGenVertexArrays(1, &vbo); 280 glBindVertexArray(vbo); 281 glGenBuffers(1, &vbo); 282 glBindBuffer(GL_ARRAY_BUFFER, vbo); 283 glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex), Vertex, GL_STATIC_DRAW); 284 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 285 glEnableVertexAttribArray(0); 286 287 288 glUseProgram(ShaderProgram); 289 290 291 292 mIsRunLoop = true; 293 return mIsRunLoop; 294} 295 296//アップデート 297void Game::Update() 298{ 299 if (glfwGetKey(Window, GLFW_KEY_ESCAPE) == GLFW_PRESS || glfwWindowShouldClose(Window) != GL_FALSE) 300 { 301 mIsRunLoop = false; 302 } 303 304 305 306 if (glfwGetKey(Window, GLFW_KEY_UP) == GLFW_PRESS) 307 { 308 309 310 }else if (glfwGetKey(Window, GLFW_KEY_DOWN) == GLFW_PRESS) 311 { 312 313 } 314 315 316 317} 318 319 320 321//描画アップデート 322void Game::GenerateOutput() 323{ 324 glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 325 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 326 glUseProgram(ShaderProgram); 327 328 329 330 331 332 glDrawArrays(GL_POLYGON, 0, 6); 333 334 335 336 337 338 339 glViewport(0, 0, WIDTH, HEIGHT); 340 glfwSwapBuffers(Window); 341 glfwPollEvents(); 342 343}

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

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

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

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

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

guest

回答1

0

ベストアンサー

glLinkProgram(ShaderProgram);
glUseProgram(ShaderProgram);

これらは,glUniformMatrix4fvとかよりも前に行わねばならないような気がします.
なので,この2行を書く位置を

//座標構造体

struct position

の直前に移動したら何か変わりませんか?

投稿2020/09/18 09:30

fana

総合スコア11632

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

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

退会済みユーザー

退会済みユーザー

2020/09/18 09:31

どっちをやっても同じでしたw自分も色々順序を探りましたがいかんせん正常に描画できないのですw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問