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

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

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

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

C++

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

GLSL

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

Q&A

解決済

1回答

2026閲覧

シェーダープログラムが有効にならない原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

GLSL

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

0グッド

0クリップ

投稿2021/04/19 06:06

編集2021/04/19 06:14

提示コードのMain関数部のwhile()文内部のshader変数部ですが描画はされますがシェーダーを使った描画ができません。フラグメントシェーダーではvec4(0.0,0.0,1.0,1.0);という青色で表示されると思うのですが描画されません。描画はされているということはシェーダーが上手く適用されていないことが原因なのですが青い色で描画させたいのですがどこで関数の指定を誤ったのでしょうか?下記のことを試しましたがわかりません。

シェーダーのコンパイルエラーはありません。
glClearColor();関数をコメントにしましたが違いました。
vec4の四つ目の引数を0や1などと透明度を触りましたが違いました。

イメージ説明

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 10 11#include "Window.hpp" 12#include "Shape.hpp" 13#include "Shader.hpp" 14 15Object::Vertex rectangleVertex[4] = 16{ 17 {-0.5f,-0.5f}, 18 {0.5f,-0.5f}, 19 {0.5f,0.5f}, 20 {-0.5f,0.5f} 21}; 22 23 24int main() 25{ 26 if (glfwInit() == GL_FALSE) 27 { 28 std::cerr << "glfw初期化失敗。" << std::endl; 29 return -1; 30 } 31 32 33 atexit(glfwTerminate); //プログラム終了時の処理を登録 34 Window window; 35 36 //OpenGL Verison 3.2 Core Profile を選択する 37 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3); 38 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,2); 39 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE); 40 glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); 41 42 Shape* shape = new Shape(2, 4, rectangleVertex); 43 44 Shader shader("Test.vert","Test.frag"); 45 shader.setBindAttribVertex(0, "Position"); 46 shader.setBindAttribFragment(0, "fragment"); 47 48 49 50 51 52 glClearColor(1.0, 0.0, 0.0, 1.0); //背景色 53 while (window) 54 { 55 glClear(GL_COLOR_BUFFER_BIT); //カラーバッファをクリア 56 shader.Active(); 57 58 shader.setUniform2fv("location",window.getLocation()); 59 shader.setUniform1f("scale",window.getScale()); 60 shader.setUniform2fv("size",window.getSize()); 61 62 63 shape->Draw(); 64 65 window.SwapBuffers(); //ダブルバッファリング 66 } 67 68} 69

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

GLSL

1out vec4 fragment; 2 3void main() 4{ 5 fragment = vec4(0.0,0.0,1.0,1.0); 6}

GLSL

1uniform vec2 size; 2uniform float scale; 3uniform vec2 location; 4in vec4 position; 5 6void main() 7{ 8 gl_Position = vec4(2.0 * scale / size,1.0,1.0) * position + vec4(location,0.0,0.0); 9}

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

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

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

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

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

K_3578

2021/04/19 06:08

>何を間違えたのでしょうか? これまでの全ての質問が物語ってる。質問者の態度。
1T2R3M4

2021/04/19 06:17

自分で理解できないコードをコピペで動作させようとしているからでは。
guest

回答1

0

ベストアンサー

Shader::ReadShaderSource
ファイルを開いて,ファイルポインタをseekして,そしてファイルを閉じている.

肝心のファイルの内容,読み込めていますか?

投稿2021/04/19 06:28

fana

総合スコア11656

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

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

退会済みユーザー

退会済みユーザー

2021/04/19 08:17

そこも原因だったみたいですが他にもあるみたいです。 また単純にコーディングミスだったのでベストアンサーにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問