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

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

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

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

GLSL

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

Q&A

解決済

1回答

884閲覧

glsl エラー「プログラム最後の検証動作が失敗」とは何が原因なのか知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

GLSL

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

0グッド

0クリップ

投稿2021/06/19 06:04

編集2021/06/21 06:21

提示コードのですがShader::Load();関数部ですがコメント部内部の関数でエラー[ 最後の検証動作が失敗 ]というとことでGL_FALSEを返すのですがこれはどういった事が原因として挙げられるのでしょうか?いろいろデバッグしましたがエラーメッセージが出ないので原因がわかりません。ProgramInfoLog();関数を色々な場所に置きましたがエラーメッセージが出ている箇所がありません。

公式リファレンス原文 [ params returns GL_TRUE or if the last validation operation on program was successful, and GL_FALSE otherwise. ]

google翻訳 [ paramsは、プログラムの最後の検証操作が成功した場合はGL_TRUEを返し、それ以外の場合はGL_FALSEを返します。 ]

[ glGetProgramiv() ] 関数リファレンス: https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glGetProgramiv.xml

glsl

1/*######################################################################### 2# 単色の二次元テキストレンダリング 頂点シェーダー 3###########################################################################*/ 4#version 330 5#extension GL_ARB_explicit_attrib_location: enable 6 7// ###################### 頂点属性 ###################### 8layout(location = 0) in vec4 vertexPosition; //頂点座標 9 10 11// ###################### 出力 ###################### 12layout(location = 1) out vec2 texCoord; //テキスト 13 14// ###################### Uniform ###################### 15uniform mat4 uViewProjection; //ビュープロジェクション行列 16 17void main() 18{ 19 20 vec4 vertex = vec4(vertexPosition.x,vertexPosition.y,0.0,1.0); //頂点座標 21 gl_Position = (uViewProjection * vertex); 22 23 texCoord = vertexPosition.zw; 24 25}

glsl

1/*######################################################################### 2# 単色の二次元テキストレンダリング フラグメントシェーダー 3###########################################################################*/ 4#version 330 5#extension GL_ARB_explicit_attrib_location: enable 6 7// ###################### 入力 ###################### 8layout(location = 1 ) in vec2 texCoord; 9 10// ###################### 出力 ###################### 11out vec4 color; 12 13// ###################### Unifrom ###################### 14uniform sampler2D text; //文字テクスチャ 15uniform vec4 uTextColor; //色 16 17void main() 18{ 19 vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, texCoord).r); 20 color = uTextColor * sampled; 21}

cpp

1#include "Shader.hpp" 2 3#include <iostream> 4#include <fstream> 5#include <string> 6#include <vector> 7#include <glm/gtc/type_ptr.hpp> 8 9// ##################################### コンストラクタ ##################################### 10FrameWork::Shader::Shader() 11{ 12 program = 0; //シェーダープログラムを初期化 13} 14 15// ##################################### シェーダーをロード ##################################### 16bool FrameWork::Shader::Load(const char* vert, const char* frag) 17{ 18 program = loadProgram(vert, frag); 19 20 int params; 21 glGetProgramiv(program, GL_LINK_STATUS, &params); 22 if (params == GL_FALSE) 23 { 24 std::cerr << "プログラムの最後のリンク操作が失敗" << std::endl; 25 } 26////////////////////////////////////////////////////////////////////////////////////////// 27 glGetProgramiv(program, GL_VALIDATE_STATUS, &params); 28 if (params == GL_FALSE) 29 { 30 ProgramInfoLog(program); 31 std::cerr << "プログラムの最後の検証動作が失敗" << std::endl; 32 } 33///////////////////////////////////////////////////////////////////////////////////////// 34 35 36 if (program == 0) 37 { 38 std::cerr << "シェーダープログラム作成エラー" << std::endl; 39 return false; 40 } 41 42 return true; 43} 44 45// ##################################### プログラムオブジェクトをロード ##################################### 46GLuint FrameWork::Shader::loadProgram(const char* vert, const char* frag) 47{ 48 std::vector<GLchar> vsrc; 49 const bool vstat = ReadShaderSource(vert, vsrc); 50 51 std::vector<GLchar> fsrc; 52 const bool fstat = ReadShaderSource(frag, fsrc); 53 54 if (vstat && fstat) 55 { 56 return CreateProgram(vsrc.data(), fsrc.data()); 57 } 58 else 59 { 60 return 0; 61 } 62} 63 64// ##################################### シェーダーファイルを読み込む ##################################### 65bool FrameWork::Shader::ReadShaderSource(const char* name, std::vector<GLchar>& buffer) 66{ 67 if (name == NULL) 68 { 69 assert(0 && "シェーダーファイルが指定されていません。"); 70 return false; 71 } 72 73 std::ifstream file(name, std::ios::binary); 74 if (file.fail() == true) 75 { 76 std::cerr << "ソースファイルが読み込めません: " << name << std::endl; 77 file.close(); 78 return false; 79 } 80 else 81 { 82 file.seekg(0L, std::ios::end); 83 GLsizei length = static_cast<GLsizei>(file.tellg()); 84 buffer.resize(length + 1); 85 86 file.seekg(0L, std::ios::beg); 87 file.read(buffer.data(), length); 88 buffer[length] = '\0'; 89 90 file.close(); 91 } 92 file.close(); 93 94 return true; 95} 96 97// ##################################### シェーダーエラーログを取得 ##################################### 98GLboolean FrameWork::Shader::CompileInfoLog(GLuint shader,const char* str) 99{ 100 GLint status; 101 102 //コンパイル結果 103 glGetShaderiv(shader, GL_COMPILE_STATUS, &status); 104 if (status == GL_FALSE) 105 { 106 std::cerr << str << std::endl; 107 } 108 109 //エラーログの長さを得る 110 GLsizei bufSize; 111 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &bufSize); 112 113 if (bufSize > 1) 114 { 115 std::vector<GLchar> infoLog(bufSize); 116 GLsizei length; 117 glGetShaderInfoLog(shader, bufSize, &length, &infoLog[0]); 118 119 std::cerr<< &infoLog[0] << std::endl; 120 } 121 122 return (GLboolean)status; 123} 124 125// ##################################### プログラムオブジェクト作成 ##################################### 126GLuint FrameWork::Shader::CreateProgram(const char* vsrc, const char* fsrc) 127{ 128 const GLuint program = glCreateProgram(); //シェーダープログラムを作成 129 130 if (vsrc != NULL) 131 { 132 const GLuint vobj = glCreateShader(GL_VERTEX_SHADER); 133 glShaderSource(vobj, 1, &vsrc, NULL); 134 glCompileShader(vobj); 135 CompileInfoLog(vobj, vsrc); 136 glAttachShader(program, vobj); 137 glDeleteShader(vobj); 138 } 139 else 140 { 141 std::cerr << "頂点シェーダー読み込み失敗" << std::endl; 142 } 143 144 if (fsrc != NULL) 145 { 146 const GLuint fobj = glCreateShader(GL_FRAGMENT_SHADER); 147 glShaderSource(fobj, 1, &fsrc, NULL); 148 glCompileShader(fobj); 149 CompileInfoLog(fobj, fsrc); 150 glAttachShader(program, fobj); 151 glDeleteShader(fobj); 152 } 153 else 154 { 155 std::cerr << "フラグメントシェーダー読み込み失敗" << std::endl; 156 } 157 158 glLinkProgram(program); //リンクプログラム 159 ProgramInfoLog(program); //リンク時のログを表示 160 161 return program; 162} 163 164// ##################################### プログラムのエラーを表示 ##################################### 165GLboolean FrameWork::Shader::ProgramInfoLog(GLuint program) 166{ 167 GLsizei bufSize; 168 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufSize); 169 170 if (bufSize > 1) 171 { 172 std::vector<GLchar> infoLog(bufSize); 173 GLsizei length; 174 glGetProgramInfoLog(program, bufSize, &length, &infoLog[0]); 175 std::cerr<<"Program Info Log: "<< infoLog.data() <<std::endl; 176 return false; 177 } 178 else 179 { 180 return true; 181 } 182} 183 184// ##################################### Attriblocationを取得 ##################################### 185GLint FrameWork::Shader::getAttribLocation(const char* str) 186{ 187 return glGetAttribLocation(program,str); 188} 189 190// ##################################### 頂点シェーダーに属性変数を関連ずける ##################################### 191void FrameWork::Shader::setBindAttribLocation(const char* str) 192{ 193 GLint n = glGetAttribLocation(program, str); 194 195 //エラー処理 196 if (n == -1) 197 { 198 std::cerr <<"setBindAttribVertex(): "<< n << std::endl; 199 } 200 else 201 { 202 glBindAttribLocation(program, n, str); 203 } 204} 205 206// ##################################### フラグメントシェーダーに属性変数を関連ずける ##################################### 207void FrameWork::Shader::setBindAttribFragment(const char* str) 208{ 209 GLint n = glGetAttribLocation(program, str); 210 211 //エラー処理 212 if (n == -1) 213 { 214 std::cerr << "setBindAttribFragment(): " << n << std::endl; 215 } 216 else 217 { 218 glBindFragDataLocation(program, n, str); 219 } 220} 221 222// ##################################### 有効にする ##################################### 223void FrameWork::Shader::setEnable() 224{ 225 glUseProgram(program); 226} 227 228// ##################################### 無効にする ##################################### 229void FrameWork::Shader::setDisable() 230{ 231 glUseProgram(0); 232} 233 234// ##################################### Uniform 設定 ##################################### 235 236//vec1 237void FrameWork::Shader::setUniform1f(const char* name, const float vec) 238{ 239 const GLuint object = glGetUniformLocation(program, name); 240 if (object == -1) { assert(0); } //エラー処理 241 glUniform1f(object,vec); 242} 243 244//vec2 245void FrameWork::Shader::setUniform2f(const char* name, const glm::vec2 vec) 246{ 247 const GLuint object = glGetUniformLocation(program, name); 248 if (object == -1) { assert(0); } //エラー処理 249 glUniform2f(object,vec.x,vec.y); 250} 251 252//vec3 253void FrameWork::Shader::setUniform3f(const char* name, const glm::vec3 vec) 254{ 255 const GLuint object = glGetUniformLocation(program, name); 256 if (object == -1) { assert(0); } //エラー処理 257 glUniform3f(object,vec.x, vec.y,vec.z); 258} 259 260//vec4 261void FrameWork::Shader::setUniform4f(const char* name, const glm::vec4 vec) 262{ 263 const GLuint object = glGetUniformLocation(program,name); 264 if (object == -1) { assert(0); } //エラー処理 265 glUniform4f(object, vec.x, vec.y, vec.z, vec.w); 266} 267 268//行列2 269void FrameWork::Shader::setUniformMatrix2fv(const char* name, const glm::mat2 m) 270{ 271 const GLuint object = glGetUniformLocation(program, name); 272 if (object == -1) { assert(0); } //エラー処理 273 glUniformMatrix2fv(object,1,false,glm::value_ptr(m)); 274} 275 276//行列3 277void FrameWork::Shader::setUniformMatrix3fv(const char* name, const glm::mat3 m) 278{ 279 const GLuint object = glGetUniformLocation(program, name); 280 if (object == -1) { assert(0); } //エラー処理 281 glUniformMatrix3fv(object, 1, false, glm::value_ptr(m)); 282} 283 284//行列4 285void FrameWork::Shader::setUniformMatrix4fv(const char* name, const glm::mat4 m) 286{ 287 const GLuint object = glGetUniformLocation(program, name); 288 if (object == -1) { assert(0); } //エラー処理 289 glUniformMatrix4fv(object, 1, false, glm::value_ptr(m)); 290} 291 292// ##################################### デストラクタ ##################################### 293FrameWork::Shader::~Shader() 294{ 295 glDeleteProgram(program); 296} 297

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

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

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

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

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

guest

回答1

0

ベストアンサー

フレームワークで変更したシェーダーファイルをゲーム側に反映していないためでした。

投稿2021/06/21 06:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問