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

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

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

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

GLSL

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

Q&A

解決済

2回答

2128閲覧

[指定された属性変数が指定されたプログラムオブジェクトのアクティブな属性でない場合 ]とはどういう意味なのか?

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

GLSL

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

0グッド

0クリップ

投稿2021/04/24 11:12

編集2021/04/25 07:57

提示コードの///コメント内部のコードですが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}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/04/25 00:50

提示サイトを質問内容に追加しました。
退会済みユーザー

退会済みユーザー

2021/04/25 07:51

文章を修正しました。
guest

回答2

0

ベストアンサー

提示コードの//リンクプログラム部ですがリンク時のログを出していなかっためログを表示させるとフラグメントシェーダーがおかしいとのメッセージが表示されました。そのメッセージはコードを修正してしまったため。忘れてしまいました。下記のGLSLスクリプトのように修正したた結果治りました。自己解決です。

cpp

1 2 3//プログラムオブジェクト作成 4GLuint Shader::CreateProgram(const char* vsrc, const char* fsrc) 5{ 6 const GLuint program = glCreateProgram(); //シェーダープログラムを作成 7 8 //std::cout << program << std::endl; 9 10 if (vsrc != NULL) 11 { 12 const GLuint vobj = glCreateShader(GL_VERTEX_SHADER); 13 glShaderSource(vobj, 1, &vsrc, NULL); 14 glCompileShader(vobj); 15 16 CompileInfoLog(vobj, vsrc); 17 18 glAttachShader(program, vobj); 19 glDeleteShader(vobj); 20 21 } 22 else { 23 std::cout << "頂点シェーダー読み込み失敗" << std::endl; 24 } 25 26 if (fsrc != NULL) 27 { 28 const GLuint fobj = glCreateShader(GL_FRAGMENT_SHADER); 29 glShaderSource(fobj, 1, &fsrc, NULL); 30 glCompileShader(fobj); 31 32 CompileInfoLog(fobj, fsrc); 33 34 glAttachShader(program, fobj); 35 glDeleteShader(fobj); 36 } 37 else { 38 std::cout << "フラグメントシェーダー読み込み失敗" << std::endl; 39 40 } 41 42 glLinkProgram(program);//リンクプログラム 43 44 ProgramInfoLog(program);//ログ表示 45 46 47 return program; 48} 49 50//プログラムのエラーを表示 51GLboolean Shader::ProgramInfoLog(GLuint program) 52{ 53 GLsizei bufSize; 54 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufSize); 55 56 if (bufSize > 1) 57 { 58 std::vector<GLchar> infoLog(bufSize); 59 60 GLsizei length; 61 glGetProgramInfoLog(program, bufSize, &length, &infoLog[0]); 62 std::cerr<<"Program Info Log: "<< infoLog.data() <<std::endl; 63 64 return false; 65 } 66 else 67 { 68 return true; 69 } 70} 71 72

cpp

1//プログラムのエラーを表示 2GLboolean Shader::ProgramInfoLog(GLuint program) 3{ 4 GLsizei bufSize; 5 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufSize); 6 7 if (bufSize > 1) 8 { 9 std::vector<GLchar> infoLog(bufSize); 10 11 GLsizei length; 12 glGetProgramInfoLog(program, bufSize, &length, &infoLog[0]); 13 std::cerr<<"Program Info Log: "<< infoLog.data() <<std::endl; 14 15 return false; 16 } 17 else 18 { 19 return true; 20 } 21} 22 23

glsl

1/*######################################################################### 2# 単色の3D描画 3###########################################################################*/ 4 5// 修正済み 6 7#extension GL_ARB_explicit_attrib_location: enable 8 9 10layout(location = 2) in vec4 vfragment; 11 12 13//出力 14out vec4 fragment; 15 16void main() 17{ 18 fragment = vfragment; 19}

投稿2021/04/27 07:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fana

2021/04/27 07:59

低評価の理由:これでは質問内容が解決してない. 本件の質問内容は > これはどういう意味なのでしょうか? [ 指定された属性変数が指定されたプログラムオブジェクトのアクティブな属性でない場合 ] という話なのであって,この回答はその点を何も解決してはいない,ということだ. あなたのプログラムが抱えていた何らかの問題点はコードを何かしら変更した結果として解消したのかもしれないけれども,そんなことは本件の質問内容とは無関係な事柄である. また,元々のフラグメントシェーダのコードは示されていなかったので,読み手にはコードの変更内容すら全く不明である.
guest

0

これはどういう意味なのでしょうか? [ 指定された属性変数が指定されたプログラムオブジェクトのアクティブな属性でない場合 ]

ここにそれらしい話があります.

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.

とのことです.
it may be accessed during program execution. と判断されなかったのかもしれません.
だとすれば,シェーダの記述に何か問題があるのかもしれません.


私は GLSL の文法に詳しくないので,以下が原因となっているのか否かを判断できませんが,

vec3(position.x,position.y,0.0) * worldView * simpleView;

という記述は不自然に感じます.
この方向の乗算(vector * matrix)って可能なのでしょうか?
(可能だとすれば,この演算の結果は何になるのでしょう?)

投稿2021/04/27 05:45

fana

総合スコア11632

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

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

fana

2021/04/27 05:47

glGetAttribLocation() を用いている記述の必要性(意図,意味)がわからないが,そのことは本件の主題ではないので言及しないこととする.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問