提示コードのコメント部の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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。