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

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

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

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

C++

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

GLSL

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

Q&A

解決済

1回答

1915閲覧

GLSLを使った描画ができない理由が知りたい。Github全ソースあり

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

GLSL

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

0グッド

1クリップ

投稿2020/09/15 09:04

編集2020/09/15 12:04

以下のコードですがシェーダーにて回転、スケール、平行移動の行列を実装してそれとビュー行列も用意してすべてを計算してると思うのですがなぜ画面に何も表示されなのでしょうか?glVertex3f();関数にて頂点の座標は正しいです。何か忘れているのでしょうか?

回転、スケール、平行移動の行列を実装
ビュー行列を実装
シェーダで値を渡す
シェーダーで計算
描画するglDrawArrays();

※ コメント部/////で囲ってあるコードが該当コードです。
参考サイト: https://tokoik.github.io/GLFWdraft.pdf (163ページに数式を移しました(ビュー行列))
Github: https://github.com/Shigurechan/project

GLSL

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

hpp

1#ifndef ___GMAE_H_ 2#define ___GMAE_H_ 3 4#define WIDTH 640 5#define HEIGHT 400 6 7#include "stdio.h" 8#include <fstream> 9#include <sstream> 10#include <iostream> 11 12 13 14#include "GLEW/include/GL/glew.h" 15 16#include "gl/GL.h" 17#include "GLFW/include/GLFW/glfw3.h" 18#include "Vector.hpp" 19//#include "Vector.hpp" 20 21 22 23class Game 24{ 25public: 26 Vector3 cv; 27 28 Game(); 29 30 bool Initialization(); 31 32 bool RunLoop(); 33 34 void Update(); 35 void GenerateOutput(); 36 37 38private: 39 bool mIsRunLoop;//メインループ 40 41 42 Vector3 pos; 43 44///////////////////////////////////////////////////////////////////////////////////////////////////////// 45 //ビュー行列 46 GLfloat view[4][4] = { 47 {1,2,6,0}, 48 {0,0,0,0}, 49 50 {0,0,0,0}, 51 {0,0,0,1} 52 53 }; 54 55 //プロジェクション 56 GLfloat projection[4][4] = { 57 { 0,0,0,0 }, 58 { 0,0,0,0 }, 59 60 { 0,0,0,0 }, 61 { 0,0,0,0 }, 62 }; 63 64 65 66 67 68 69 GLfloat vet[6][3] = { 0 }; 70 71 Vector3 v[6] = { 0 }; 72 73 74 //頂点バッファー 75 GLfloat Vertex[6][3] = 76 { 77 {-0.5, 0.5, 1.0}, 78 {-0.5, -0.5, 1.0}, 79 {0.5, -0.5, 1.0}, 80 81 {-0.5, 0.5, 1.0}, 82 {0.5, 0.5, 1.0}, 83 {0.5, -0.5, 1.0} 84 }; 85 86 87 88 89 90 91 //スケール行列 92 const GLfloat scale[4][4] = { 93 {1,0,0,0}, 94 {0,1,0,0}, 95 {0,0,1,0}, 96 {0,0,0,1} 97 }; 98 99 100 //回転 101 float r = 1; 102 const GLfloat rotate[4][4] = { 103 (pos.x * pos.x +(1 - cos(r)) + cos(r)), 104 (pos.x * pos.y +(1 - cos(r)) + pos.z * sin(r)) 105 ,(pos.x * pos.z +(1 - cos(r)) - pos.y * sin(r)),0, 106 107 108 (pos.x * pos.x +(1 - cos(r)) + sin(r)), 109 (pos.y * pos.y +(1 - cos(r)) + cos(r)), 110 (pos.y * pos.z +(1 - cos(r)) + pos.x * sin(r)),0, 111 112 113 (pos.x * pos.z + (1 - cos(r)) - pos.z * sin(r)), 114 (pos.y * pos.z +(1 - cos(r)) - pos.x * sin(r)), 115 (pos.z * pos.z + (1 - cos(r)) + cos(r)),0, 116 }; 117 118 119 //平行移動 120 float mx = 0; 121 float my = 0; 122 float mz = 0; 123 const GLfloat move[4][4] = 124 { 125 1,0,0,mx, 126 0,1,0,my, 127 0,0,1,mz, 128 0,0,0,1, 129 }; 130 131 132 133 134//////////////////////////////////////////////////////////////////////////////////////////////////////////////// 135 136 GLuint vbo = 0;//頂点配列バッファオブジェクト名 137 GLuint vao = 0;//頂点バッファオブジェクト名 138 139 GLFWwindow* Window = nullptr;//OpenGLコンテキスト 140 141 GLuint program = 0; 142 bool Shader();//シェーダ読み込み 143 void Compile_log(GLuint Shader);//シェーダーコンパイルログ 144 void Link_log(GLuint Shader);//シェーダーリンクログ 145 146 void GetShader_Log(GLuint shader_type,GLuint Log_type); 147 148 149 void create_maxtri_mp(float top, float bottom, float left, float right, 150 float far, float near, float result[4][4]); 151 152 153 154}; 155 156 157 158#endif 159

cpp

1#include "Game.hpp" 2#include <iostream> 3//#include "stdafx.h" 4#include <iostream> 5#include <string> 6#include <fstream> 7#include <sstream> 8#include "Vector.hpp" 9 10 11//透視投影変換行列を作る 12void Game::create_maxtri_mp(float top, float bottom, float left, float right, 13 float near, float far, float result[4][4]) 14{ 15 result[0][0] = (2 * near) / (right - left); 16 result[0][1] = 0; 17 result[0][2] = (right + left) / (right - left); 18 result[0][3] = 0; 19 20 result[1][0] = 0; 21 result[1][1] = (2 * near) / (top - bottom); 22 result[1][2] = (top + bottom) / (top - bottom); 23 result[1][3] = 0; 24 25 result[2][0] = 0; 26 result[2][1] = 0; 27 result[2][2] = -(far + near) / (far - near); 28 result[2][3] = -(2 * far + near) / (far - near); 29 30 result[3][0] = 0; 31 result[3][1] = 0; 32 result[3][2] = -1; 33 result[3][3] = 0; 34} 35 36 37//コンストラクタ 38Game::Game() 39{ 40 mIsRunLoop = true; 41 42} 43 44//メインループ 45bool Game::RunLoop() 46{ 47 if (mIsRunLoop == true) 48 { 49 Update(); 50 GenerateOutput(); 51 } 52 else { 53 return false; 54 } 55 return true; 56 57} 58 59 60//シェーダー関係のログを取得 61void Game::GetShader_Log(GLuint shader_type, GLuint Log_type) 62{ 63 GLint bufferSize = 0; 64 GLchar* infoLog = nullptr; 65 66 //成功したかどうか? 67 glGetShaderiv(shader_type, Log_type, &bufferSize); 68 if (bufferSize == GL_FALSE) 69 { 70 //printf(""); 71 } 72 //ログの長さを取得する 73 glGetShaderiv(shader_type, GL_INFO_LOG_LENGTH, &bufferSize); 74 75 infoLog = (GLchar*)malloc(bufferSize); 76 77 if (infoLog != NULL) 78 { 79 GLsizei length;//ログの長さ 80 glGetShaderInfoLog(shader_type, bufferSize, &length, infoLog); 81 82 if (length > 1)//null文字を含むため一文字以上の場合ログ出力 83 { 84 fprintf(stderr, "InfoLog: %s\n\n", infoLog); 85 } 86 87 free(infoLog);//メモリ開放 88 infoLog = NULL; 89 } 90 91 //return true; 92} 93 94//シェーダを実装する 95bool Game::Shader() 96{ 97 98 program = glCreateProgram(); 99 GLuint out_vert = glCreateShader(GL_VERTEX_SHADER); 100 GLuint out_frag = glCreateShader(GL_FRAGMENT_SHADER); 101 102 //頂点シェーダーを読み込み 103 std::string fileName = "Basic.vert"; 104 std::ifstream shaderfile(fileName); 105 if (shaderfile.is_open()) 106 { 107 std::stringstream sstream; 108 sstream << shaderfile.rdbuf(); 109 std::string str = sstream.str(); 110 const char* cc = str.c_str(); 111 112 out_vert = glCreateShader(GL_VERTEX_SHADER); 113 glShaderSource(out_vert, 1, &cc, nullptr); 114 glCompileShader(out_vert); 115 //printf("Basic.vert ファイル読み込み\n"); 116 117 GetShader_Log(out_vert, GL_COMPILE_STATUS); 118 glAttachShader(program, out_vert); 119 shaderfile.close(); 120 121 } 122 else { 123 shaderfile.close(); 124 printf("ファイル: %s が読み込めませんでした。", fileName.c_str()); 125 } 126 127 128 //バーティックスシェーダーを読み込み 129 fileName = "Basic.frag"; 130 shaderfile.open(fileName); 131 if (shaderfile.is_open()) 132 { 133 134 std::stringstream sstream; 135 sstream << shaderfile.rdbuf(); 136 std::string str = sstream.str(); 137 const char* cc = str.c_str(); 138 139 out_frag = glCreateShader(GL_FRAGMENT_SHADER); 140 glShaderSource(out_frag, 1, &cc, nullptr); 141 glCompileShader(out_frag); 142 GetShader_Log(out_frag, GL_COMPILE_STATUS); 143 glAttachShader(program, out_frag); 144 shaderfile.close(); 145 146 // printf("Basic.frag ファイル読み込み\n"); 147 } 148 else { 149 shaderfile.close(); 150 printf("ファイル: %s が読み込めませんでした。", fileName.c_str()); 151 } 152 153 154 155 glLinkProgram(program); 156 //使わなくなったシェーダーオブジェクトを削除 157 glDeleteShader(out_frag); 158 glDeleteShader(out_vert); 159 glUseProgram(program); 160 161 162 //シェーダーに値を渡す 163///////////////////////////////////////////////////////////////////////////////////////////////////////////// 164//***************************************************************************** 165 float mp[4][4]; 166 create_maxtri_mp(HEIGHT, -HEIGHT, -WIDTH, WIDTH, 0.1, 0.0000000001, mp);//透視行列を作成 167 168 //フラグメントシェーダー 169 glBindAttribLocation(program, 0, "Vertex"); 170 171 172 //頂点シェーダー 173 glBindAttribLocation(program, 0, "Vertex"); 174 glUniformMatrix4fv(glGetUniformLocation(program, "scale"), 0, GL_TRUE, &scale[0][0]); 175 glUniformMatrix4fv(glGetUniformLocation(program, "rotate"), 1, GL_TRUE, &rotate[0][0]); 176 glUniformMatrix4fv(glGetUniformLocation(program, "move"), 2, GL_TRUE, &move[0][0]); 177 178 179 glUniformMatrix4fv(glGetUniformLocation(program, "MP"), 3, GL_TRUE, &mp[0][0]); 180 //***************************************************************************** 181 //////////////////////////////////////////////////////////////////////////////////////////////////////////////// 182 glUseProgram(program); 183 184 185 186 return true; 187} 188 189 190 191 192//初期化 193bool Game::Initialization() 194{ 195 //画面初期化 関係 196 /////////////////////////////////////////////////////////////////////////////////////////////////////////// 197 //glfwの初期化に失敗 198 if (glfwInit() != GL_TRUE) 199 { 200 printf("glfwInit()失敗\n"); 201 int _c = getchar(); 202 203 return 0; 204 } 205 206 //コンテキストを作成 207 Window = glfwCreateWindow(640, 400, "Hello", NULL, NULL); 208 209 //OpenGLコンテキストの作成に失敗 210 if (Window == NULL) 211 { 212 printf("glfCreateWindow()失敗\n"); 213 int c = getchar(); 214 215 return 0; 216 } 217 218 //コンテキストをOpenGLの描画対象にする。 219 glfwMakeContextCurrent(Window); 220 221 //glewを初期化する。 222 glewExperimental = GL_TRUE; 223 if (glewInit() != GLEW_OK) 224 { 225 printf("glewInit() の初期化に失敗しました。"); 226 return 0; 227 } 228 229 //OpenGLバージョン指定 230 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); 231 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 0); 232 233 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 234 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 235 236 //垂直同期のタイミングを待つ 237 glfwSwapInterval(1); 238 /////////////////////////////////////////////////////////////////////////////////////////////////////////// 239 240 241 242 if (Shader() == true)//シェーダーを読み込む 243 { 244 printf("シェーダーを読み込む\n"); 245 } 246 247 248 glGenVertexArrays(1, &vbo); 249 glBindVertexArray(vbo); 250 glGenBuffers(1, &vbo); 251 glBindBuffer(GL_ARRAY_BUFFER, vbo); 252 glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex), Vertex, GL_STATIC_DRAW);/////// 253 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 254 glEnableVertexAttribArray(0); 255 //glEnableClientState(GL_VERTEX_ARRAY);//クライアントで頂点を有効にする。 256 257 258 259 260 261 mIsRunLoop = true; 262 return mIsRunLoop; 263} 264 265//アップデート 266void Game::Update() 267{ 268 if (glfwGetKey(Window, GLFW_KEY_ESCAPE) == GLFW_PRESS || glfwWindowShouldClose(Window) != GL_FALSE) 269 { 270 mIsRunLoop = false; 271 } 272 273 274} 275 276//描画アップデート 277void Game::GenerateOutput() 278{ 279 glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 280 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 281 glUseProgram(program); 282 283 284 285 glDrawArrays(GL_POLYGON,0,18); 286 287 288 289 290 291 292 glViewport(0, 0, WIDTH, HEIGHT); 293 glfwSwapBuffers(Window); 294 glfwWaitEvents(); 295 296};

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • create_maxtri_mpの引数を調整。
  • glUniformMatrix4fvの第2引数は個数なので1を指定
  • 並行移動の行列を調整して奥に移動

とりあえず上記を修正したら表示はされました。

あとは、回転行列の部分は元が何をしようとしているかが不明なので、
とりあえず画面の更新で回転するようにしてみました。

hpp

1 //平行移動 2 float mx = 0; 3 float my = 0; 4 float mz = -3; // 奥へ移動 5 const GLfloat move[4][4] = 6 { 7 1,0,0,mx, 8 0,1,0,my, 9 0,0,1,mz, 10 0,0,0,1, 11 };

cpp

1#include "Game.hpp" 2#include <iostream> 3//#include "stdafx.h" 4#include <iostream> 5#include <string> 6#include <fstream> 7#include <sstream> 8#include "Vector.hpp" 9 10 11//透視投影変換行列を作る 12void Game::create_maxtri_mp(float top, float bottom, float left, float right, 13 float near, float far, float result[4][4]) 14{ 15 result[0][0] = (2 * near) / (right - left); 16 result[0][1] = 0; 17 result[0][2] = (right + left) / (right - left); 18 result[0][3] = 0; 19 20 result[1][0] = 0; 21 result[1][1] = (2 * near) / (top - bottom); 22 result[1][2] = (top + bottom) / (top - bottom); 23 result[1][3] = 0; 24 25 result[2][0] = 0; 26 result[2][1] = 0; 27 result[2][2] = -(far + near) / (far - near); 28 result[2][3] = -(2 * far + near) / (far - near); 29 30 result[3][0] = 0; 31 result[3][1] = 0; 32 result[3][2] = -1; 33 result[3][3] = 0; 34} 35 36 37//コンストラクタ 38Game::Game() 39{ 40 mIsRunLoop = true; 41 42} 43 44//メインループ 45bool Game::RunLoop() 46{ 47 if (mIsRunLoop == true) 48 { 49 Update(); 50 GenerateOutput(); 51 } 52 else { 53 return false; 54 } 55 return true; 56 57} 58 59 60//シェーダー関係のログを取得 61void Game::GetShader_Log(GLuint shader_type, GLuint Log_type) 62{ 63 GLint bufferSize = 0; 64 GLchar* infoLog = nullptr; 65 66 //成功したかどうか? 67 glGetShaderiv(shader_type, Log_type, &bufferSize); 68 if (bufferSize == GL_FALSE) 69 { 70 //printf(""); 71 } 72 //ログの長さを取得する 73 glGetShaderiv(shader_type, GL_INFO_LOG_LENGTH, &bufferSize); 74 75 infoLog = (GLchar*)malloc(bufferSize); 76 77 if (infoLog != NULL) 78 { 79 GLsizei length;//ログの長さ 80 glGetShaderInfoLog(shader_type, bufferSize, &length, infoLog); 81 82 if (length > 1)//null文字を含むため一文字以上の場合ログ出力 83 { 84 fprintf(stderr, "InfoLog: %s\n\n", infoLog); 85 } 86 87 free(infoLog);//メモリ開放 88 infoLog = NULL; 89 } 90 91 //return true; 92} 93 94//シェーダを実装する 95bool Game::Shader() 96{ 97 98 program = glCreateProgram(); 99 GLuint out_vert = glCreateShader(GL_VERTEX_SHADER); 100 GLuint out_frag = glCreateShader(GL_FRAGMENT_SHADER); 101 102 //頂点シェーダーを読み込み 103 std::string fileName = "Basic.vert"; 104 std::ifstream shaderfile(fileName); 105 if (shaderfile.is_open()) 106 { 107 std::stringstream sstream; 108 sstream << shaderfile.rdbuf(); 109 std::string str = sstream.str(); 110 const char* cc = str.c_str(); 111 112 out_vert = glCreateShader(GL_VERTEX_SHADER); 113 glShaderSource(out_vert, 1, &cc, nullptr); 114 glCompileShader(out_vert); 115 //printf("Basic.vert ファイル読み込み\n"); 116 117 GetShader_Log(out_vert, GL_COMPILE_STATUS); 118 glAttachShader(program, out_vert); 119 shaderfile.close(); 120 121 } 122 else { 123 shaderfile.close(); 124 printf("ファイル: %s が読み込めませんでした。", fileName.c_str()); 125 } 126 127 128 //バーティックスシェーダーを読み込み 129 fileName = "Basic.frag"; 130 shaderfile.open(fileName); 131 if (shaderfile.is_open()) 132 { 133 134 std::stringstream sstream; 135 sstream << shaderfile.rdbuf(); 136 std::string str = sstream.str(); 137 const char* cc = str.c_str(); 138 139 out_frag = glCreateShader(GL_FRAGMENT_SHADER); 140 glShaderSource(out_frag, 1, &cc, nullptr); 141 glCompileShader(out_frag); 142 GetShader_Log(out_frag, GL_COMPILE_STATUS); 143 glAttachShader(program, out_frag); 144 shaderfile.close(); 145 146 // printf("Basic.frag ファイル読み込み\n"); 147 } 148 else { 149 shaderfile.close(); 150 printf("ファイル: %s が読み込めませんでした。", fileName.c_str()); 151 } 152 153 glBindAttribLocation(program, 0, "position"); 154 155 156 glLinkProgram(program); 157 //使わなくなったシェーダーオブジェクトを削除 158 glDeleteShader(out_frag); 159 glDeleteShader(out_vert); 160 glUseProgram(program); 161 162 163 //シェーダーに値を渡す 164///////////////////////////////////////////////////////////////////////////////////////////////////////////// 165//***************************************************************************** 166 float mp[4][4]; 167 create_maxtri_mp(1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 10.0f, mp);//透視行列を作成 168 169 const GLfloat rot[4][4] = { 170 {1,0,0,0}, 171 {0,1,0,0}, 172 {0,0,1,0}, 173 {0,0,0,1} 174 }; 175 176 //頂点シェーダー 177 glUniformMatrix4fv(glGetUniformLocation(program, "scale"), 1, GL_TRUE, &scale[0][0]); 178 glUniformMatrix4fv(glGetUniformLocation(program, "rotate"), 1, GL_TRUE, &rot[0][0]); 179 glUniformMatrix4fv(glGetUniformLocation(program, "move"), 1, GL_TRUE, &move[0][0]); 180 181 182 glUniformMatrix4fv(glGetUniformLocation(program, "MP"), 1, GL_TRUE, &mp[0][0]); 183 //***************************************************************************** 184 //////////////////////////////////////////////////////////////////////////////////////////////////////////////// 185 glUseProgram(program); 186 187 188 189 return true; 190} 191 192 193 194 195//初期化 196bool Game::Initialization() 197{ 198 //画面初期化 関係 199 /////////////////////////////////////////////////////////////////////////////////////////////////////////// 200 //glfwの初期化に失敗 201 if (glfwInit() != GL_TRUE) 202 { 203 printf("glfwInit()失敗\n"); 204 int _c = getchar(); 205 206 return 0; 207 } 208 209 //コンテキストを作成 210 Window = glfwCreateWindow(640, 400, "Hello", NULL, NULL); 211 212 //OpenGLコンテキストの作成に失敗 213 if (Window == NULL) 214 { 215 printf("glfCreateWindow()失敗\n"); 216 int c = getchar(); 217 218 return 0; 219 } 220 221 //コンテキストをOpenGLの描画対象にする。 222 glfwMakeContextCurrent(Window); 223 224 //glewを初期化する。 225 glewExperimental = GL_TRUE; 226 if (glewInit() != GLEW_OK) 227 { 228 printf("glewInit() の初期化に失敗しました。"); 229 return 0; 230 } 231 232 //OpenGLバージョン指定 233 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); 234 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 0); 235 236 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 237 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 238 239 //垂直同期のタイミングを待つ 240 glfwSwapInterval(1); 241 /////////////////////////////////////////////////////////////////////////////////////////////////////////// 242 243 244 245 if (Shader() == true)//シェーダーを読み込む 246 { 247 printf("シェーダーを読み込む\n"); 248 } 249 250 251 glGenVertexArrays(1, &vbo); 252 glBindVertexArray(vbo); 253 glGenBuffers(1, &vbo); 254 glBindBuffer(GL_ARRAY_BUFFER, vbo); 255 glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex), Vertex, GL_STATIC_DRAW);/////// 256 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 257 glEnableVertexAttribArray(0); 258 //glEnableClientState(GL_VERTEX_ARRAY);//クライアントで頂点を有効にする。 259 260 261 262 263 264 mIsRunLoop = true; 265 return mIsRunLoop; 266} 267 268//アップデート 269void Game::Update() 270{ 271 if (glfwGetKey(Window, GLFW_KEY_ESCAPE) == GLFW_PRESS || glfwWindowShouldClose(Window) != GL_FALSE) 272 { 273 mIsRunLoop = false; 274 } 275 276 277} 278 279static void rotateX(GLfloat radian, GLfloat m[]) 280{ 281 float s = sin(radian); 282 float c = cos(radian); 283 m[0] = 1.0; m[1] = 0.0; m[2] = 0.0; m[3] = 0.0; 284 m[4] = 0.0; m[5] = c; m[6] = -s; m[7] = 0.0; 285 m[8] = 0.0; m[9] = s; m[10] = c; m[11] = 0.0; 286 m[12] = 0.0; m[13] = 0.0; m[14] = 0.0; m[15] = 1.0; 287} 288 289//描画アップデート 290void Game::GenerateOutput() 291{ 292 glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 293 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 294 glUseProgram(program); 295 296 static float rotX = 0; 297 float rot[16]; 298 rotateX(rotX, rot); 299 rotX += 0.01f; 300 301 glUniformMatrix4fv(glGetUniformLocation(program, "rotate"), 1, GL_FALSE, rot); 302 303 304 glDrawArrays(GL_POLYGON, 0, 18); 305 306 307 308 309 310 311 glViewport(0, 0, WIDTH, HEIGHT); 312 glfwSwapBuffers(Window); 313 glfwPollEvents(); 314 315}

投稿2020/09/15 10:46

編集2020/09/15 14:17
mah

総合スコア591

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

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

退会済みユーザー

退会済みユーザー

2020/09/15 10:50

いえ、正しいみたいです。 //使わなくなったシェーダーオブジェクトを削除 glDeleteShader(out_frag); glDeleteShader(out_vert); のあとにシェーダーの値渡しコードを置いて見ましたが同じでした。
mah

2020/09/15 10:52

glUseProgram(program);が抜けているのは確認しましたか? こちらでは回答のソースで四角形が描画されました。
退会済みユーザー

退会済みユーザー

2020/09/15 11:13

表示されません。一様ですがその関数すべてのコードを回答欄に乗せてくれますでしょうか?wお手数かけます
mah

2020/09/15 11:40

すいません、シェーダーのソースを確認用に変えていたのを忘れていました。 で、元のソースに戻したら表示されなくなったので、原因がわかったら回答に追記します。
退会済みユーザー

退会済みユーザー

2020/09/15 11:41

わかりました。でも順序はどちらにせよ変なのでそこは修正します
退会済みユーザー

退会済みユーザー

2020/09/15 12:05

Githubに全文のソースファイルがあるのでそちらを御覧ください。
mah

2020/09/15 14:19

回答を更新しました。
退会済みユーザー

退会済みユーザー

2020/09/15 23:04 編集

質問ですが。moveの部分を全部0にすると表示されないのですが何もしないでただ画面に表示するだけの場合moveはどうしたらいいのでしょうか?
mah

2020/09/15 23:38

moveを全部0にしたい理由がわかりませんが、ただ画面に表示するだけでも頂点がnear~farの範囲に収まっていないと表示されないのでなんらかの方法で移動させる必要があります。 頂点のZ座標が1.0なので最初から-2.0とかにしておけば、とりあえずmoveをいじらなくても表示はされます。
退会済みユーザー

退会済みユーザー

2020/09/15 23:47

なるほど。rotateX関数に行列がありますが自分は自分で用意した行列を使いましたがこれでも実装できましたがどうなのでしょうか?move行列配列のconstを外し自分でmove[2][3] += 0.01f;などとして
mah

2020/09/16 00:36 編集

質問の意味がわからないです。とりあえずいろいろ値をいじってみればいいんではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問