質問編集履歴

1 投げやりな文章を修正

退会済みユーザー

退会済みユーザー

2021/04/19 15:14  投稿

シェーダープログラムが有効にならない原因が知りたい。
提示コードのMain関数部のwhile()文内部のshader変数部ですが描画はされますがシェーダーを使った描画ができません。フラグメントシェーダーではvec4(0.0,0.0,1.0,1.0);という青色で表示されると思うのですがなぜ描画されないのでしょうか?**描画はされているということはシェーダーが上手く適用されていないことが原因**なのですが何を間違えたのでしょうか?
提示コードのMain関数部のwhile()文内部のshader変数部ですが描画はされますがシェーダーを使った描画ができません。フラグメントシェーダーではvec4(0.0,0.0,1.0,1.0);という青色で表示されると思うのですが描画されません。**描画はされているということはシェーダーが上手く適用されていないことが原因**なのですが青い色で描画させたいのですがどこで関数の指定を誤ったのでしょうか?下記のことを試しましたがわかりません。
シェーダーのコンパイルエラーはありません。
glClearColor();関数をコメントにしましたが違いました。
vec4の四つ目の引数を0や1などと透明度を触りましたが違いました。
![イメージ説明](f68623b4d7162eb6a6bc9293dc204013.png)
```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);
}
```
  • C++

    8532 questions

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

  • OpenGL

    508 questions

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

  • GLSL

    121 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る