提示コードですが最下部のコマンドラインのようなエラーが出てしまい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]$
回答1件
あなたの回答
tips
プレビュー