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

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

ただいまの
回答率

87.49%

GLSL 変数を使っているのにglGetUniformLocation()関数で-1が返ってくる理由が知りたい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 585

score -34

提示コードですがMesh::Draw()関数のshader.setUniformMatrix4fv("uTranslate",getMatTranslation());関数で下記のエラーが出ます。これはなぜでしょうか?MeshクラスのコンストラクタでシェーダーをロードしてDraw()関数で使っているのですが
なぜ-1のエラーが返ってくるのか原因がわりません。

確認したこと

その他の2Dで円や矩形などの描画はこのクラスで行えるのでshaderクラスは問題ないです。

Github: https://github.com/Shigurechan/GL

$ ./GL
this->vertex: 24
this->index: 0
this->texture: 0

あああ
GL: source/Shader.cpp:295: void FrameWork::Shader::setUniformMatrix4fv(const char*, glm::mat4): Assertion `0' failed.
// ##################################### mat4 ##################################### 
void FrameWork::Shader::setUniformMatrix4fv(const char* name, const glm::mat4 m)
{
    const GLuint object = glGetUniformLocation(program, name);
    if (object == -1) { assert(0); }    //エラー処理
    glUniformMatrix4fv(object, 1, false, glm::value_ptr(m));
}
/*#########################################################################
# 
###########################################################################*/
#version 420
//#extension GL_ARB_explicit_uniform_location : require


layout(location = 0) in vec3 vertexPosition;    
//layout(location = 1) in vec2 vertexUV;    
//layout(location = 2) in vec3 vertexNormal;    


//layout(location = 3) out vec2 vUV;    
layout(location = 1) out vec4 vFragment;    
//layout(location = 4) out vec3 vNormal;    



uniform mat4 uTranslate;    
uniform mat4 uRotate;        
uniform mat4 uScale;        
uniform mat4 uViewProjection;    

uniform vec4 uFragment;


void main()
{
    vec4 vertex = vec4(vertexPosition,1.0);
    mat4 model = uTranslate * uRotate * uScale;        
    gl_Position = (uViewProjection * model) * vertex;



//    vUV = vertexUV;        
    vFragment = uFragment;
//    vNormal = vertexNormal;        
}
/*#########################################################################
# 
###########################################################################*/
#version 420
//#extension GL_ARB_explicit_uniform_location : require


//layout(location = 3) in vec2 vUV;    
layout(location = 1) in vec4 vfragment;    

//layout(location = 4) in vec3 vNormal;    



//uniform sampler2D uImage;    
out vec4 fragment;

void main()
{
    fragment = vfragment;
//    fragment = texture(uImage,vUV);
}
#include "../header/Model.hpp"

#include <iostream>
#include <assert.h>
#include <vector>
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
#include <glm/glm.hpp>
#include <GL/glew.h>
#include "../lib/stb/stb_image.h"

#include "../header/Resource.hpp"
#include "../header/Camera.hpp"


FrameWork::D3::Mesh::Mesh(std::vector<VertexAttribute> ver, std::vector<unsigned int> idx, std::vector<Texture> tex) : Transform()
{
      this->vertex = ver;     //頂点
      this->index = idx;      //インデックス
      this->texture = tex;    //テクスチャ

      printf("this->vertex: %d\n",this->vertex.size());
      printf("this->index: %d\n",this->index.size());
      printf("this->texture: %d\n\n",this->texture.size());

    if ( shader.Input(FrameWork::LoadShader("Shader/3D/BasicMono_3D.vert")->data(), FrameWork::LoadShader("Shader/3D/BasicMono_3D.frag")->data()) == false)
      {
            printf("シェーダーロード失敗\n");
      }



    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);

      glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

      //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);

      //glBufferData(GL_ELEMENT_ARRAY_BUFFER, index.size() * sizeof(unsigned int),index.data(), GL_DYNAMIC_DRAW);
      glBufferData(GL_ARRAY_BUFFER, vertex.size() * sizeof(VertexAttribute), vertex.data(), GL_DYNAMIC_DRAW);  

      GLint attrib = shader.getAttribLocation("vertexPosition");
      glEnableVertexAttribArray(attrib);
      glVertexAttribPointer(attrib, 1, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
      shader.setBindAttribLocation("vertexPosition");


      //printf("あああ\n");

      // vertex texture coords
      //attrib = shader.getAttribLocation("vertexUV");
      //glEnableVertexAttribArray(attrib);    
      //glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute), (void*)(sizeof(GLfloat) * 3));
//printf("ららら\n");
      // vertex normals
      //attrib = shader.getAttribLocation("vertexNormal");
      //glEnableVertexAttribArray(attrib);    
      //glVertexAttribPointer(attrib, 3, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute), (void*)(sizeof(GLfloat) * 5));


      glBindVertexArray(0);
      glBindBuffer(GL_ARRAY_BUFFER, 0);


}



void FrameWork::D3::Mesh::Draw()
{
      shader.setEnable();

    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexAttribute) * vertex.size(), vertex.data());

    //Transform    
    setPosition(glm::vec3(0,0,-20));    //座標
    setScale(glm::vec3(10,10,10));      //スケール
    setRotate(glm::vec3(0,0,0),0);    //回転

    //描画
    shader.setUniformMatrix4fv("uTranslate",getMatTranslation());
    shader.setUniformMatrix4fv("uRotate", getMatRotate());
    shader.setUniformMatrix4fv("uScale", getMatScale());
    shader.setUniform4f("uFragment", FrameWork::GetGlColor(glm::vec4(0,0,255,255)));
    shader.setUniformMatrix4fv("uViewProjection", FrameWork::Camera::getViewProjection());

      for(unsigned int i = 0; i < texture.size(); i++)
      {
            //glBindTexture(GL_TEXTURE_2D, texture[i].id);
            //glActiveTexture(GL_TEXTURE0 + i);
      }

      //glDrawElements(GL_TRIANGLES, index.size(), GL_UNSIGNED_INT, 0);
      glDrawArrays(GL_TRIANGLES,0,vertex.size());

    //バインド解除
    glBindVertexArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    //glBindTexture(GL_TEXTURE_2D, 0);

    shader.setDisable();
}

void FrameWork::D3::Model::processNode(aiNode *node, const aiScene *scene)
{

      for(unsigned int i = 0;  i< node->mNumMeshes; i++)
      {
            //printf("push_back\n");

            aiMesh *m = scene->mMeshes[node->mMeshes[i]];
            mesh.push_back(processMesh(m,scene));
      }

      for(unsigned int i = 0;  i< node->mNumChildren; i++)
      {
            //printf("再帰的\n");
            processNode(node->mChildren[i],scene);
      }
}

void FrameWork::D3::Model::loadModel(const char *path)
{
      Assimp::Importer import;
      //const aiScene *scene = import.ReadFile(path,aiProcess_Triangulate);
      const aiScene *scene = import.ReadFile(path,aiProcess_Triangulate | aiProcess_FlipUVs);

      if(scene == NULL)
      {
            std::cerr<<"ERROR::ASIMP: " << import.GetErrorString() <<std::endl;
            assert(0);
      }

      std::string str(path);

      directory = str.substr(0,str.find_last_of('/'));

      processNode(scene->mRootNode, scene);      
}



FrameWork::D3::Mesh FrameWork::D3::Model::processMesh(aiMesh *m, const aiScene *scene)
{
      // data to fill
      std::vector<VertexAttribute> ver(0);
      std::vector<unsigned int> idx(0);
      std::vector<Texture> tex(0);


      for(unsigned int i = 0; i < m->mNumVertices; i++)
      {
            VertexAttribute vert;
            glm::vec3 vector; 
            vert.position[0] = m->mVertices[i].x;
            vert.position[1] = m->mVertices[i].y;
            vert.position[2] = m->mVertices[i].z;

            // normals
            if (m->HasNormals() == true)
            {
                  //vert.normal[0] = m->mNormals[i].x;
                  //vert.normal[1] = m->mNormals[i].y;
                  //vert.normal[2] = m->mNormals[i].z;

            }

            // texture coordinates
            if(m->mTextureCoords != NULL)
            {
                  glm::vec2 vec;
                  //vert.uv[0] = m->mTextureCoords[0][i].x; 

            }
            else
            {
                  //vert.uv[0] = 0.0f;
                  //vert.uv[1] = 0.0f;

            }
            ver.push_back(vert);
      }


     return Mesh(ver, idx, tex);

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • akagi_chan

    2021/10/12 18:40

    質問内容を変更しました。

    キャンセル

  • episteme

    2021/10/12 19:40

    > 連動してないことをどうやって確認すればいいのでしょうか?

    なにを寝ボケたことを。あなた「確認したのですが」って言ったぞ。
    テキトーな返答しかできんのなら僕はここまで。

    キャンセル

  • 退会済みユーザー

    2021/10/13 01:03

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

checkベストアンサー

+1

githubのコードをビルドして調べてみたところ、途中でglDeleteProgramが呼ばれてprogramが破棄されてしまっているようでした。

変数がコピーで渡されているところでデストラクタが呼ばれてglDeleteProgramも呼び出されてしまっているのかもしれません。

OpenGLのプログラムのデバッグではRenderDocやapitraceなどのツールを使うとわかりやすいことがあるのでおすすめです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/10/15 10:48 編集

    誤投稿です。

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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