提示コードの///コメント内部のコードですがglGetAttribLocation();関数で-1のエラーの値が返ってくるのですがこれはなぜでしょうか?公式リファレンスの説明を見ましたがどうしても原因がわかりません。
公式リファレンス: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetAttribLocation.xhtml
Google翻訳「
glGetAttribLocationは、プログラムで指定された以前にリンクされたプログラムオブジェクトに、名前で指定された属性変数を照会し、その属性変数にバインドされている汎用頂点属性のインデックスを返します。 nameが行列属性変数の場合、行列の最初の列のインデックスが返されます。指定された属性変数が指定されたプログラムオブジェクトのアクティブな属性でない場合、または名前が予約済みのプレフィックス「gl_」で始まる場合は、値-1が返されます。
」
これはどういう意味なのでしょうか? [ 指定された属性変数が指定されたプログラムオブジェクトのアクティブな属性でない場合 ]
cpp
1#include "DrawTest.hpp" 2 3#include <iostream> 4#include "Shader.hpp" 5#include <glm/gtx/matrix_transform_2d.hpp> 6#include <glm/glm.hpp> 7 8//コンストラクタ 9DrawTest::DrawTest() 10{ 11 shader = std::make_shared<Shader>("Basic_2D.vert","Basic_2D.frag"); //シェーダー 12 13 //頂点配列 14 struct Vertex 15 { 16 GLfloat position[2]; 17 // GLfloat color[4]; 18 }; 19 20 //頂点情報 21 Vertex rectangleVertex[4] = 22 { 23 //頂点、頂点色 24 {-0.5f,-0.5f}, 25 {0.5f,-0.5f }, 26 {0.5f,0.5f }, 27 {-0.5f,0.5f } 28 }; 29 30 31 32 //vao 33 glGenVertexArrays(1, &vao); 34 glBindVertexArray(vao); 35 36 //vbo 37 glGenBuffers(1, &vbo); 38 glBindBuffer(GL_ARRAY_BUFFER, vbo); 39 40 //頂点 41 glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertex), rectangleVertex, GL_STATIC_DRAW); 42 glVertexAttribPointer(0, 2, GL_FLOAT,GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0); 43 glEnableVertexAttribArray(0); 44 45//////////////////////////////////////////////////////////////// 46 shader->setBindAttribVertex("position"); 47//////////////////////////////////////////////////////////////// 48 49 50 /* 51 //頂点カラー 52 glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertex), rectangleVertex, GL_STATIC_DRAW); 53 glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*) (4 * sizeof(float))); 54 glEnableVertexAttribArray(1); 55 */ 56 57 58 59 60 61 //スケール 62 glm::mat3 Scale = glm::mat3(); 63 Scale = glm::scale(Scale, glm::vec2(1, 1)); 64 65 //回転 66 glm::mat3 Rotate = glm::mat3(); 67 Rotate = glm::rotate(Rotate, 1.0f); 68 69 //平行移動 70 glm::mat3 Translate = glm::mat3(); 71 Translate = glm::translate(Translate, glm::vec2(1, 1)); 72 73 glm::mat3 simpleView = glm::mat3(); 74 75 simpleView; 76 77 78 79 80 81 82 83} 84 85//更新 86void DrawTest::Update() 87{ 88 89 90 91 92 93} 94 95//描画 96void DrawTest::Draw() 97{ 98 shader->setEnable(); 99 100 101 shader->setUniform4f("ufragment", glm::vec4(0.0, 1.0, 0.0, 1.0)); 102 103 104 105 glDrawArrays(GL_LINE_LOOP, 0, 4); 106 107 shader->setDisable(); 108} 109 110//デストラクタ 111DrawTest::~DrawTest() 112{ 113 glDeleteVertexArrays(1, &vao); 114 glDeleteBuffers(1, &vbo); 115 116} 117 118
GLSL
1in vec2 position; //頂点座標 2 3 4uniform mat3 uScale; //スケール 5uniform mat3 uRotate; //回転 6uniform mat3 uTranslate; //平行移動 7uniform mat3 simpleView; //射形行列 8 9 10uniform vec4 uFragment; //色 11 12out vec4 vFragment; 13 14void main() 15{ 16 17 mat3 worldView = uScale * uRotate * uTranslate; 18 vec3 pos = vec3(position.x,position.y,0.0) * worldView * simpleView; 19 gl_Position = vec4(pos,0.0); //座標 20 21 22 vFragment = uFragment; //カラー 23}
cpp
1 2//フラグメントシェーダーに属性変数を関連ずける 3void Shader::setBindAttribFragment(const char* str) 4{ 5 GLint n = glGetAttribLocation(program, str); 6 7 //エラー処理 8 if (n == -1) 9 { 10 std::cerr << "setBindAttribFragment(): " << n << std::endl; 11 } 12 else 13 { 14 glBindFragDataLocation(program, n, str); 15 } 16}
回答2件
あなたの回答
tips
プレビュー