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

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

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

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

C++

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

GLSL

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

Q&A

解決済

1回答

1259閲覧

GLSL フラグメントシェーダーで色が出力されず白になってしまう原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

GLSL

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

0グッド

0クリップ

投稿2020/09/18 02:21

編集2020/09/18 06:56

提示画像のLoadShader();関数部の////コメント部で囲ってるコードの内部ですがなぜフラグメントシェーダーで色が付かないのでしょうか?
提示コードにもある通りしっかりout vec4 fragment;としてあると思うのですがこれはなぜでしょうか?コードにコメントを書いてコードを整形して余計なところに無駄にシェーダー関係のコードがないか確認して整理してきましたが何も怪しいものはありませんどうしたらいいのでしょうか?

イメージ説明

GLSL

1#version 400 2//フラグメントシェーダー 3out vec4 fragment; 4 5void main() 6{ 7 fragment = vec4(0.0,0.0,1.0,1.0); 8}

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#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#include "GLEW/include/GL/glew.h" 13 14#include "gl/GL.h" 15#include "GLFW/include/GLFW/glfw3.h" 16#include "Vector.hpp" 17 18 19class Game 20{ 21public: 22 Vector3 cv; 23 24 Game(); 25 26 bool Initialization(); 27 28 bool RunLoop(); 29 30 void Update(); 31 void GenerateOutput(); 32 33 34private: 35 bool mIsRunLoop;//メインループ 36 37 float mp[16] = { 0 };//透視射形行列 38 39//頂点バッファー 40 float Vertex[6][4] = 41 { 42 {-0.5, 0.5, -1.0, 1.0}, 43 {-0.5, -0.5, -1.0, 1.0}, 44 {0.5, -0.5, -1.0, 1.0}, 45 46 {-0.5, 0.5, -1.0, 1.0}, 47 {0.5, 0.5, -1.0, 1.0 }, 48 {0.5, -0.5, -1.0, 1.0} 49 }; 50 51 52 //透視投影変換行列を作る 53 void create_matri_mp(float top, float bottom, float left, float right,float near, float far, float result[16]); 54 55 bool LoadShader(const char* VertName, GLenum type_a, const char* FragName, GLenum type_b); 56 57 58 //シェーダーを読み込んでコンパイルして適用 59 bool CompileShader(const char *fileName, GLenum type); 60 61 GLuint vbo = 0;//頂点配列バッファオブジェクト名 62 GLuint vao = 0;//頂点バッファオブジェクト名 63 64 GLFWwindow* Window = nullptr;//OpenGLコンテキスト 65 66 GLuint ShaderProgram;//シェーダープログラム 67 68 69 bool Shader();//シェーダ読み込み 70 void Compile_log(GLuint Shader);//シェーダーコンパイルログ 71 void Link_log(GLuint Shader);//シェーダーリンクログ 72 73 void GetShader_Log(GLuint shader_type,GLuint Log_type);//ログ 74}; 75#endif 76

cpp

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

いろんな引数,合ってますか?

glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex), Vertex, GL_STATIC_DRAW);

↑sizeof(Vertex)で良いか?

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

↑第二引数は3で合っているか?

glDrawArrays(GL_POLYGON, 0, 18);

↑最後の 18 とは何の値?

投稿2020/09/18 02:58

fana

総合スコア11996

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

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

fana

2020/09/18 03:00

float Vertex[6][4] ← [4]にする必要って何ですか?
退会済みユーザー

退会済みユーザー

2020/09/18 07:14 編集

質問ですがフラグメントシェーダーのコードはこれで正解なのでしょうか?
退会済みユーザー

退会済みユーザー

2020/09/18 08:29 編集

//シェーダーを読み込み std::ifstream shaderfile(VertName); if (shaderfile.is_open()) { std::stringstream sstream; sstream << shaderfile.rdbuf(); std::string str = sstream.str(); const char* cc = str.c_str(); glShaderSource(out_vert_shader, 1, &cc, nullptr); glCompileShader(out_vert_shader); printf("ファイル読み込み成功: %s\n", VertName); GetShader_Log(out_vert_shader, GL_COMPILE_STATUS); glAttachShader(ShaderProgram, out_vert_shader); shaderfile.close(); } else { shaderfile.close(); printf("ファイル: %s が読み込めませんでした。", VertName); } を関数化せず一行にまとめたたら実行できました。今度は画面に何も表示されなくなったのですがひとまず解決とさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問