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

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

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

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

C++

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

Q&A

解決済

2回答

2044閲覧

glGetAttribLocation;関数がエラーになる原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2021/06/08 11:13

編集2021/06/09 02:13

提示コードの/////コメント内部のコードですがglGetAttribLocation();関数にて-1というエラーが発生してしまいます。-1
呼んだ関数の引数の値が無効な値もしくは範囲外の場合 という意味なのですがなぜこういったエラーが発生するのでしょうか?
glGetEroor();関数では0x01と表示され同じエラーコードの意味でした。

調査したこと。
program変数でエラーが出てないかどうか?確認しましたが出ていません。
上の二つのlayoutが設定できているならprogram変数には問題がないのです。

参考サイト: https://qiita.com/_ydah/items/da56763e94ba58af3d91
イメージ説明

glsl

1/*######################################################################### 2# フォング 頂点シェーダー 3###########################################################################*/ 4#version 330 5#extension GL_ARB_explicit_attrib_location: enable 6 7 8 9 10// ###################### 頂点属性 ###################### 11layout(location = 0) in vec2 vertexPosition; //頂点座標 12layout(location = 1) in vec2 vertexUV; //UV座標 13layout(location = 2) in vec3 vertexNorm; //法線 14 15// ###################### 出力 ###################### 16layout(location = 3) out vec2 vUV; //UV 17layout(location = 4) out vec3 vNorm; //法線 18 19// ###################### Unifrom ###################### 20uniform mat4 uScale; //スケール 21uniform mat4 uRotate; //回転 22uniform mat4 uTranslate; //平行移動 23 24uniform mat4 uViewProjection; //ビュープロジェクション行列 25 26 27 28 29void main() 30{ 31 vec4 vertex = vec4(vertexPosition,0.0,1.0); //頂点座標 32 mat4 model = uTranslate * uRotate * uScale; //モデル行列 33 gl_Position = (uViewProjection * model) * vertex; 34 35 vNorm = vertexNorm; 36 37 38 39 vUV = vertexUV; //UV座標 40}

cpp

1 2 //テクスチャ関係 3 textureID = std::vector<TextureData>(0); //テクスチャーデータ 4 textureUnitCount = 0; //テクスチャユニット数をカウント 5 6 //vao 7 glGenVertexArrays(1, &vao); 8 glBindVertexArray(vao); 9 10 //vbo 11 glGenBuffers(1, &vbo); 12 glBindBuffer(GL_ARRAY_BUFFER, vbo); 13 14 //頂点 15 GLint attrib = getAttribLocation("vertexPosition"); 16 glEnableVertexAttribArray(attrib); 17 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_DYNAMIC_DRAW); 18 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (GLvoid*)0); 19 setBindAttribVertex("vertexPosition"); 20 21 //UV 22 attrib = getAttribLocation("vertexUV"); 23 glEnableVertexAttribArray(attrib); 24 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_DYNAMIC_DRAW); 25 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2)); 26 setBindAttribVertex("vertexUV"); 27 28//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 29 //Norm 30 attrib = getAttribLocation("vertexNorm"); 31 std::cout << attrib << std::endl; 32 glEnableVertexAttribArray(attrib); 33 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_DYNAMIC_DRAW); 34 glVertexAttribPointer(attrib, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 4)); 35 setBindAttribVertex("vertexNorm"); 36//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

glsl

1/*######################################################################### 2# フォング フラグメントシェーダー 3###########################################################################*/ 4#version 330 5 6#extension GL_ARB_explicit_attrib_location: enable 7 8// ###################### 入力 ###################### 9layout(location = 3) in vec2 vUV; //UV座標 10layout(location = 4) in vec3 vNorm; //法線 11 12// ###################### Unifrom ###################### 13uniform sampler2D uImage; //イメージ 14 15//出力 16out vec4 fragment; 17 18void main() 19{ 20 21 fragment = texture(uImage,vUV); 22}

cpp

1 2//頂点シェーダーに属性変数を関連ずける 3void FrameWork::Shader::setBindAttribVertex(const char* str) 4{ 5 GLint n = glGetAttribLocation(program, str); 6 7 //エラー処理 8 if (n == -1) 9 { 10 std::cerr <<"setBindAttribVertex(): "<< n << std::endl; 11 } 12 else 13 { 14 glBindAttribLocation(program, n, str); 15 } 16} 17 18 19//フラグメントシェーダーに属性変数を関連ずける 20void FrameWork::Shader::setBindAttribFragment(const char* str) 21{ 22 GLint n = glGetAttribLocation(program, str); 23 24 //エラー処理 25 if (n == -1) 26 { 27 std::cerr << "setBindAttribFragment(): " << n << std::endl; 28 } 29 else 30 { 31 glBindFragDataLocation(program, n, str); 32 } 33} 34

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/08 23:26

「glGetAttribVertex()」とはどれのことでしょうか?
退会済みユーザー

退会済みユーザー

2021/06/09 00:51

提示文章を修正しました。
fana

2021/06/09 01:49

フラグメントシェーダはどうなってるの? 以前は(何がどうなったのか全く不明だが)フラグメントシェーダを修正して対応した らしいですが??
退会済みユーザー

退会済みユーザー

2021/06/09 01:49

以前と違ってリンクエラーが出ないので原因がわからなのです。
guest

回答2

0

ベストアンサー

フラグメントシェーダで vNorm を使用していない
→ vNormの元をたどるとバーテックスシェーダの vertexNorm であり,この vertexNorm はそれ以外のことにはまったく使用されていない.

…といったことから,
vertexNorm はリンクの過程で "active" じゃない扱いになったんじゃないですかね.

論拠は,以前の質問の回答にて引用した

An attribute variable (either built-in or user-defined) is considered active if it is determined during the link operation that it may be accessed during program execution.

の部分です.

投稿2021/06/09 02:22

fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/09 02:26

out vec3 norm; void main() { norm = vNorm; fragment = texture(uImage,vUV); } フラグメントシェーダーでこうしたら動きました。エラーがなくなりました。!
fana

2021/06/09 02:28

> out vec3 norm; この出力ってどこに行くんだろう?
退会済みユーザー

退会済みユーザー

2021/06/09 02:33

とりえずです。
guest

0

提示コードの/////コメント内部のコードですがglGetAttribVertex();関数にて-1というエラーが発生してしまいます。-1

呼んだ関数の引数の値が無効な値もしくは範囲外の場合 という意味なのですがなぜこういったエラーが発生するのでしょうか?

該当の関数が存在しないので、一般的な話となりますが。
下記ページの「Errors」のように、「glGetError()」で取得できるエラーコードとその理由は記載されています。
glGetAttribLocation - OpenGL 4 Reference Pages

投稿2021/06/08 23:42

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/09 00:52

glGetAttribLocation();関数のことですが。glGetError()関数でも同じ0x01が表示され意味は同じでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問