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

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

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

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

C++

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

GLSL

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

解決済

glGetUniformLocation() が - 1 を返す理由が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

GLSL

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

1回答

-2評価

0クリップ

429閲覧

投稿2021/10/24 10:27

編集2021/10/25 01:21

提示コードですが最下部のコマンドラインのようなエラーが出てしまいglGetUniformLocation()関数で -1が返ってくるのですが原因がわりません。
なぜ-1なのでしょうか?

確認したこと

viewPos変数はシェーダー内で使われています。
名前も正しいです。
他の変数も使われています。
保存しているかどうかも確認しました。
シェーダーのリンクエラー、コンパイルエラーのログを取っていますが出ていません。
コメント部内部のcube.shader->setUniform3f("viewPos",FrameWork::Camera::getPosition()); 部でエラーが出てしまいます。がコメントアウトすると動きます。この関数だけが問題です。

Github: https://github.com/Shigurechan/GL/tree/039d930db49003de83566337de224c482553370b

Main.cpp
#include "../header/FrameWork.hpp" #include "../header/Resource.hpp" #include <iostream> #include "../header/Camera.hpp" int main() { FrameWork::Init(glm::ivec2(800, 600), glm::ivec2(4,2), "FrameWork"); // 初期化 FrameWork::Camera::Init(); //カメラ初期化 FrameWork::ObjFile cubeFile; FrameWork::D3::LoadObj("Model/Cube.obj",cubeFile); FrameWork::D3::Object cube(cubeFile); FrameWork::ObjFile groundFile; FrameWork::D3::LoadObj("Model/ground.obj",groundFile); FrameWork::D3::Object ground(groundFile); float y = 0; float x = 0; float angleY = 0; float angleX = 0; while (*FrameWork::windowContext) { FrameWork::windowContext->FrameUpdate(glm::vec4(0,0,0,255)); if(FrameWork::windowContext->getKeyInput(GLFW_KEY_LEFT) > (short)0) { x += 0.1; // printf("left\n"); // printf("%f , %f \n",x,y); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_RIGHT) > (short)0) { x += -0.1; // printf("right\n"); // printf("%f , %f \n",x,y); } if(FrameWork::windowContext->getKeyInput(GLFW_KEY_UP) > (short)0) { y += 0.1; // printf("up\n"); // printf("%f , %f \n",x,y); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_DOWN) > (short)0) { y += -0.1; // printf("down\n"); // printf("%f , %f \n",x,y); } if(FrameWork::windowContext->getKeyInput(GLFW_KEY_A) > (short)0) { angleY = 0.001; cube.setRotate(glm::vec3(0,1,0),angleY); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_D) > (short)0) { angleY = -0.001; cube.setRotate(glm::vec3(0,1,0),angleY); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_W) > (short)0) { angleY = 0.001; cube.setRotate(glm::vec3(1,0,0),angleY); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_S) > (short)0) { angleY = -0.001; cube.setRotate(glm::vec3(1,0,0),angleY); } FrameWork::Camera::setLook(glm::vec3(x,y,-1)); FrameWork::Camera::setPosition(glm::vec3(0,0,200.0f)); ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //Cube cube.shader->setEnable(); cube.setPosition(glm::vec3(0,10,0)); cube.setScale(glm::vec3(30,30,30)); cube.shader->setUniform3f("objectColor", glm::vec3(1.0f, 0.5f, 0.31f)); cube.shader->setUniform3f("lightColor", glm::vec3(1.0f, 1.0f, 1.0f)); cube.shader->setUniform3f("lightPos", glm::vec3(0,0,10.0f)); printf("あああ\n"); cube.shader->setUniform3f("viewPos",FrameWork::Camera::getPosition()); printf("いいい\n"); cube.Renderer(); cube.shader->setDisable(); //Ground ground.shader->setEnable(); ground.setPosition(glm::vec3(0,-50,-5)); ground.setScale(glm::vec3(20,20,20)); ground.shader->setUniform3f("objectColor", glm::vec3(1.0f, 0.5f, 0.31f)); ground.shader->setUniform3f("lightColor", glm::vec3(1.0f, 1.0f, 1.0f)); ground.shader->setUniform3f("lightPos", glm::vec3(0,0,10)); // ground.shader->setUniform3f("viewPos", FrameWork::Camera::getPosition()); ground.Renderer(); ground.shader->setDisable(); /////////////////////////////////////////////////////////////////////////////////////////////////////////////// FrameWork::windowContext->Wait(); FrameWork::windowContext->SwapBuffers(); } return 0; }
Shader
// ##################################### vec3 ##################################### void FrameWork::Shader::setUniform3f(const char* name, const glm::vec3 vec) { const GLuint object = glGetUniformLocation(program, name); if (object == -1) { assert(0); } //エラー処理 glUniform3f(object,vec.x, vec.y,vec.z); }
Vertex Shader
/*######################################################################### # ###########################################################################*/ #version 420 //#extension GL_ARB_explicit_uniform_location : require layout(location = 0) in vec3 vertexPosition; layout(location = 1) in vec3 vertexNormal; uniform mat4 uTranslate; uniform mat4 uRotate; uniform mat4 uScale; uniform mat4 uViewProjection; layout(location = 2) out vec3 vPosition; layout(location = 3) out vec3 vNormal; void main() { vec4 vertex = vec4(vertexPosition,1.0); mat4 model = uTranslate * uRotate * uScale; gl_Position = (uViewProjection * model) * vertex; vPosition = vec3(model * vec4(vertexPosition,1.0)); vNormal = vertexNormal; }
Fragment shader
/*######################################################################### # ###########################################################################*/ #version 420 //#extension GL_ARB_explicit_uniform_location : require layout(location = 2) in vec3 fPosition; layout(location = 3) in vec3 fNormal; uniform vec3 lightPos; uniform vec3 lightColor; uniform vec3 objectColor; uniform vec3 viewPos; out vec4 fragment; void main() { // ambient float ambientStrength = 0.1; vec3 ambient = ambientStrength * lightColor; // diffuse vec3 norm = normalize(fNormal); vec3 lightDir = normalize(lightPos - fPosition); float diff = max(dot(norm, lightDir), 0.0); vec3 diffuse = diff * lightColor; // specular float specularStrength = 0.5; vec3 viewDir = normalize(viewPos - fPosition); vec3 reflectDir = reflect(-lightDir, norm); float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32); vec3 specular = specularStrength * spec * lightColor; vec3 result = (ambient + diffuse) * objectColor; fragment = vec4(result, 1.0); }
$ ./GL あああ GL: source/Shader.cpp:263: void FrameWork::Shader::setUniform3f(const char*, glm::vec3): Assertion `0' failed. 中止 (コアダンプ) [shigurechan@localhost GL]$

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/10/25 00:41 編集

いえ違います。Shaderクラスのデストラクタは発動していません。
退会済みユーザー

退会済みユーザー

2021/10/25 01:21

確認したことを追加

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

OpenGL

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

C++

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

GLSL

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