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

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

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

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

C++

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

GLSL

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

解決済

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

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

GLSL

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

1回答

-5評価

0クリップ

1033閲覧

投稿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

//#define GLEW_STATIC //スタティックリンク #include <iostream> #include <fstream> #include <cstdlib> #include <vector> #include <glew/include/GL/glew.h> #include <glfw/include/GLFW/glfw3.h> #include "Window.hpp" #include "Shape.hpp" #include "Shader.hpp" Object::Vertex rectangleVertex[4] = { {-0.5f,-0.5f}, {0.5f,-0.5f}, {0.5f,0.5f}, {-0.5f,0.5f} }; int main() { if (glfwInit() == GL_FALSE) { std::cerr << "glfw初期化失敗。" << std::endl; return -1; } atexit(glfwTerminate); //プログラム終了時の処理を登録 Window window; //OpenGL Verison 3.2 Core Profile を選択する glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,2); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); Shape* shape = new Shape(2, 4, rectangleVertex); Shader shader("Test.vert","Test.frag"); shader.setBindAttribVertex(0, "Position"); shader.setBindAttribFragment(0, "fragment"); glClearColor(1.0, 0.0, 0.0, 1.0); //背景色 while (window) { glClear(GL_COLOR_BUFFER_BIT); //カラーバッファをクリア shader.Active(); shader.setUniform2fv("location",window.getLocation()); shader.setUniform1f("scale",window.getScale()); shader.setUniform2fv("size",window.getSize()); shape->Draw(); window.SwapBuffers(); //ダブルバッファリング } }

cpp

#include "Shader.hpp" #include <iostream> #include <fstream> #include <string> #include <vector> //コンストラクタ Shader::Shader(const char* vert, const char* frag) { program = loadProgram(vert,frag); } //シェーダーをロード GLuint Shader::loadProgram(const char* vert, const char* frag) { std::vector<GLchar> vsrc; const bool vstat = ReadShaderSource(vert, vsrc); std::vector<GLchar> fsrc; const bool fstat = ReadShaderSource(frag, fsrc); if (vstat && fstat) { return CreateProgram(vsrc.data(), fsrc.data()); } else { return 0; } } //シェーダーファイルを読み込む bool Shader::ReadShaderSource(const char* name, std::vector<GLchar>& buffer) { if (name == NULL) { return false; } std::ifstream file(name, std::ios::binary); if (file.fail()) { std::cerr << "ソースファイルが読み込めません: " << name << std::endl; return false; } file.seekg(0L, std::ios::end); GLsizei length = static_cast<GLsizei>(file.tellg()); buffer.resize(length + 1); file.seekg(0L, std::ios::beg); buffer[length] = '\0'; if (file.fail()) { std::cerr << "ソースファイルを読み込めません: " << name << std::endl; file.close(); return false; } file.close(); return true; } //エラーログを取得 GLboolean Shader::InfoLog(GLuint shader, const char* str) { GLint status; //コンパイル結果 glGetShaderiv(shader, GL_COMPILE_STATUS, &status); if (status == GL_FALSE) { std::cerr << "コンパイルエラー " << str << std::endl; } //エラーログの長さを得る GLsizei bufSize; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &bufSize); if (bufSize > 1) { std::vector<GLchar> infoLog(bufSize); GLsizei length; glGetShaderInfoLog(shader, bufSize, &length, &infoLog[0]); std::cerr<< &infoLog[0] << std::endl; } return (GLboolean)status; } //プログラムオブジェクト作成 GLuint Shader::CreateProgram(const char* vsrc, const char* fsrc) { const GLuint program(glCreateProgram()); if (vsrc != NULL) { const GLuint vobj(glCreateShader(GL_VERTEX_SHADER)); glShaderSource(vobj, 1, &vsrc, NULL); glCompileShader(vobj); InfoLog(vobj, vsrc); glAttachShader(program, vobj); glDeleteShader(vobj); } else { std::cout << "頂点シェーダー読み込み失敗" << std::endl; } if (fsrc != NULL) { const GLuint fobj(glCreateShader(GL_VERTEX_SHADER)); glShaderSource(fobj, 1, &fsrc, NULL); glCompileShader(fobj); InfoLog(fobj, fsrc); glAttachShader(program, fobj); glDeleteShader(fobj); } else { std::cout << "フラグメントシェーダー読み込み失敗" << std::endl; } glLinkProgram(program); return program; } //頂点シェーダーに属性変数を関連ずける void Shader::setBindAttribVertex(int num, const char* str) { glBindAttribLocation(program, num, str); } //フラグメントシェーダーに属性変数を関連ずける void Shader::setBindAttribFragment(int num, const char* str) { glBindFragDataLocation(program, num, str); } //有効にする void Shader::Active() { glUseProgram(program); } //vector2 float void Shader::setUniform2fv(const char* name, const glm::vec2 vec) { const GLuint object = glGetUniformLocation(program, name); GLfloat v[2] = { vec.x,vec.y }; glUniform2fv(object, 1, v); } //float 1 void Shader::setUniform1f(const char* name, const float vec) { const GLuint object = glGetUniformLocation(program, name); glUniform1f(object,vec); } //デストラクタ Shader::~Shader() { }

GLSL

out vec4 fragment; void main() { fragment = vec4(0.0,0.0,1.0,1.0); }

GLSL

uniform vec2 size; uniform float scale; uniform vec2 location; in vec4 position; void main() { gl_Position = vec4(2.0 * scale / size,1.0,1.0) * position + vec4(location,0.0,0.0); }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

K_3578

2021/04/19 06:08

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

2021/04/19 06:17

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenGL

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

C++

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

GLSL

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