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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/09/18 09:31