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

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

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

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

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

デバッグ

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

C++

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

Q&A

解決済

1回答

3272閲覧

glUseProgram();関数でエラーコード0x502が発生する理由が知りたい。 glCreateProgram();関数がエラーになる。?

退会済みユーザー

退会済みユーザー

総合スコア0

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

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

デバッグ

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

C++

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

0グッド

0クリップ

投稿2021/04/22 11:14

提示コードのコメント部のshader.Active();関数で提示画像ようにエラー0x502発生していますデバッグするとglUseProgram();関数でエラーが発生していてそのprogaram変数を追うとglCreateProgram():関数に行きつくのですが中身を見ると1とい値が入っています。glUseProgaram();関数でエラーglCreateProgram();関数が失敗しているというのはどういう意味なのでしょうか?ちなみにprogram変数には1という値が入っていますがこれもなんかおかしい感じがするのではやりglCreateProgram();関数で失敗していると思います。この関数が廃止されて関数とは思えません。

※Main();関数でopengl glfw glew の初期化はすんでいます。

glGetErro()" [0x502 現在のステートで無効な操作をしている場合、もしくは廃止された関数を呼び出した場合 ]

イメージ説明
参考サイト: https://qiita.com/_ydah/items/da56763e94ba58af3d91
公式リファレンス: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUseProgram.xhtml

cpp

1//#define GLEW_STATIC //スタティックリンク 2#include <iostream> 3#include <fstream> 4#include <cstdlib> 5#include <vector> 6#include <glew/include/GL/glew.h> 7#include <glfw/include/GLFW/glfw3.h> 8 9#include "Window.hpp" 10#include "Shader.hpp" 11#include "DrawTest.hpp" 12 13 14int main() 15{ 16 if (glfwInit() == GL_FALSE) 17 { 18 std::cerr << "glfw初期化失敗。" << std::endl; 19 return -1; 20 } 21 22 atexit(glfwTerminate); //プログラム終了時の処理を登録 23 Window window; //コンテキストを作成 24 25 //OpenGL Verison 3.2 Core Profile を選択する 26 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3); 27 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3); 28 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE); 29 glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); 30 31 glClearColor(1.0, 0.0, 0.0, 1.0); //背景色 32// ############################################################################# 33 34 35 DrawTest test; //表示オブジェクト 36 37 Shader shader("Test.vert","Test.frag"); 38 39 //shader.setBindAttribVertex("position"); 40 41 //shader.setBindAttribVertex("fragment"); 42 43 //shader.setBindAttribFragment("out_fragment"); 44 45 //shader.setUniform4fv(); 46 while (window) 47 { 48 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //カラーバッファをクリア 49////////////////////////////////////////////////// 50 shader.Active(); 51////////////////////////////////////////////////// 52 test.Draw(); 53 54 55 56 57 58 59 60 61 window.SwapBuffers(); //ダブルバッファリング 62 } 63 64} 65

cpp

1#include "Shader.hpp" 2 3#include <iostream> 4#include <fstream> 5#include <string> 6#include <vector> 7 8//コンストラクタ 9Shader::Shader(const char* vert, const char* frag) 10{ 11 program = loadProgram(vert,frag); 12 if (program == 0) 13 { 14 std::cerr << "シェーダープログラム作成エラー"<<std::endl; 15 exit(1); 16 } 17 18 //std::cout<< program << std::endl; 19 20} 21 22//シェーダーをロード 23GLuint Shader::loadProgram(const char* vert, const char* frag) 24{ 25 std::vector<GLchar> vsrc; 26 const bool vstat = ReadShaderSource(vert, vsrc); 27 28 std::vector<GLchar> fsrc; 29 const bool fstat = ReadShaderSource(frag, fsrc); 30 31 32 if (vstat && fstat) 33 { 34 return CreateProgram(vsrc.data(), fsrc.data()); 35 } 36 else { 37 return 0; 38 } 39} 40 41 42 43//シェーダーファイルを読み込む 44bool Shader::ReadShaderSource(const char* name, std::vector<GLchar>& buffer) 45{ 46 if (name == NULL) 47 { 48 return false; 49 } 50 51 52 std::ifstream file(name, std::ios::binary); 53 if (file.fail()) 54 { 55 std::cerr << "ソースファイルが読み込めません: " << name << std::endl; 56 file.close(); 57 return false; 58 } 59 60 file.seekg(0L, std::ios::end); 61 GLsizei length = static_cast<GLsizei>(file.tellg()); 62 buffer.resize(length + 1); 63 64 file.seekg(0L, std::ios::beg); 65 file.read(buffer.data(), length); 66 buffer[length] = '\0'; 67 68 if (file.fail()) 69 { 70 std::cerr << "ソースファイルを読み込めません: " << name << std::endl; 71 file.close(); 72 73 return false; 74 } 75 76 file.close(); 77 return true; 78} 79 80 81 82//エラーログを取得 83GLboolean Shader::InfoLog(GLuint shader, const char* str) 84{ 85 GLint status; 86 87 //コンパイル結果 88 glGetShaderiv(shader, GL_COMPILE_STATUS, &status); 89 if (status == GL_FALSE) 90 { 91 std::cerr << "コンパイルエラー " << str << std::endl; 92 } 93 94 //エラーログの長さを得る 95 GLsizei bufSize; 96 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &bufSize); 97 98 if (bufSize > 1) 99 { 100 std::vector<GLchar> infoLog(bufSize); 101 GLsizei length; 102 glGetShaderInfoLog(shader, bufSize, &length, &infoLog[0]); 103 104 std::cerr<< &infoLog[0] << std::endl; 105 } 106 107 108 109 return (GLboolean)status; 110} 111 112 113 114 115//プログラムオブジェクト作成 116GLuint Shader::CreateProgram(const char* vsrc, const char* fsrc) 117{ 118 const GLuint program = glCreateProgram(); //シェーダープログラムを作成 119 //std::cout << program << std::endl; 120 121 if (vsrc != NULL) 122 { 123 const GLuint vobj = glCreateShader(GL_VERTEX_SHADER); 124 glShaderSource(vobj, 1, &vsrc, NULL); 125 glCompileShader(vobj); 126 127 InfoLog(vobj, vsrc); 128 129 glAttachShader(program, vobj); 130 glDeleteShader(vobj); 131 132 } 133 else { 134 std::cout << "頂点シェーダー読み込み失敗" << std::endl; 135 } 136 137 if (fsrc != NULL) 138 { 139 const GLuint fobj = glCreateShader(GL_FRAGMENT_SHADER); 140 glShaderSource(fobj, 1, &fsrc, NULL); 141 glCompileShader(fobj); 142 143 InfoLog(fobj, fsrc); 144 145 glAttachShader(program, fobj); 146 glDeleteShader(fobj); 147 } 148 else { 149 std::cout << "フラグメントシェーダー読み込み失敗" << std::endl; 150 151 } 152 153 glLinkProgram(program); 154 155 return program; 156} 157 158//頂点シェーダーに属性変数を関連ずける 159void Shader::setBindAttribVertex(const char* str) 160{ 161 GLint n = glGetAttribLocation(program, str); 162 163 //エラー処理 164 if (n == -1) 165 { 166 std::cerr <<"setBindAttribVertex(): "<< n << std::endl; 167 } 168 else 169 { 170 glBindAttribLocation(program, n, str); 171 } 172} 173 174 175//フラグメントシェーダーに属性変数を関連ずける 176void Shader::setBindAttribFragment(const char* str) 177{ 178 GLint n = glGetAttribLocation(program, str); 179 180 //エラー処理 181 if (n == -1) 182 { 183 std::cerr << "setBindAttribFragment(): " << n << std::endl; 184 } 185 else 186 { 187 glBindFragDataLocation(program, n, str); 188 } 189} 190 191//有効にする 192void Shader::Active() 193{ 194 glUseProgram(program); 195} 196 197// ######################################################### Uniform 設定 198 199//vec1 200void Shader::setUniform1f(const char* name, const float vec) 201{ 202 const GLuint object = glGetUniformLocation(program, name); 203 glUniform1f(object, vec); 204} 205 206//vec2 207void Shader::setUniform2fv(const char* name, const glm::vec2 vec) 208{ 209 const GLuint object = glGetUniformLocation(program, name); 210 GLfloat v[2] = { vec.x,vec.y }; 211 glUniform2fv(object, 1, v); 212} 213 214//vec3 215void Shader::setUniform3fv(const char* name, const glm::vec3 vec) 216{ 217 const GLuint object = glGetUniformLocation(program, name); 218 GLfloat v[3] = { vec.x,vec.y,vec.z }; 219 glUniform3fv(object, 1, v); 220} 221 222//vec 4 223void Shader::setUniform4fv(const char* name, const glm::vec4 vec) 224{ 225 const GLuint object = glGetUniformLocation(program,name); 226 GLfloat v[4] = { vec.x,vec.y,vec.z,vec.w }; 227 glUniform4fv(object,1,v); 228 229} 230 231 232 233//デストラクタ 234Shader::~Shader() 235{ 236 237} 238

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

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

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

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

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

guest

回答1

0

ベストアンサー

自己解決です。glCreateProgram(),glUseProgram(); 関数に問題はなくただ単に何もしていないのに
シェーダープログラムを有効にしてシェーダーに値を送信していためで無効な動作を判断していたみたいです。

投稿2021/04/22 12:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問