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

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

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

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

C++

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

GLSL

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

解決済

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

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

GLSL

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

1回答

-3評価

0クリップ

1374閲覧

投稿2021/10/10 08:23

編集2021/10/13 10:28

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

確認したこと

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

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

command

$ ./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.

Shader.cpp

// ##################################### 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)); }

vert

/*######################################################################### # ###########################################################################*/ #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); }

Mode.cpp

#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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

episteme

2021/10/12 04:39

m->mNumFaces : faceの数 と m->mFaces : face列 が連動していないんじゃありませんか? 確認しましたか?
退会済みユーザー

退会済みユーザー

2021/10/12 05:25

確認したのですが。そもそもUVデータとか自体読み込めていない可能性があるのでコードを最小限の状態に小さくしてみました。
episteme

2021/10/12 06:07

そんなん質問する前にやっとくことでしょ。 ...で、どうなったんです?
退会済みユーザー

退会済みユーザー

2021/10/12 09:16 編集

連動してないことをどうやって確認すればいいのでしょうか?調べましたがわりません。 変数を調べましたがNULLではありまねん。
退会済みユーザー

退会済みユーザー

2021/10/12 09:40

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

2021/10/12 10:40

> 連動してないことをどうやって確認すればいいのでしょうか? なにを寝ボケたことを。あなた「確認したのですが」って言ったぞ。 テキトーな返答しかできんのなら僕はここまで。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

OpenGL

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

C++

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

GLSL

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