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

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

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

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

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

C++

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

3DCG

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

GLSL

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

Q&A

解決済

1回答

998閲覧

GLSLを適用したコードで頂点座標が変更される原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

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

C++

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

3DCG

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

GLSL

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

0グッド

1クリップ

投稿2021/04/21 08:33

編集2021/04/21 08:43

提示コードの////コメントの内部のコードです 正方形となる頂点座標を入力して単純なシェーダーを使って描画を行いたいのですが線が描画されてしまいます。この原因がわかりません。頂点情報の位置情報は変わっていないのですが**どうった原因で位置情報が変更されているのでしょうか?**頂点座標を変更するコードはこのプログラムにはありません

試したこと [ 頂点シェーダーファイルのvec4変数の第三引数や第四引数をいじりましたが表示は変わりません。またフラグメントシェーダーは単純に色を描画するだけなので問題ないです。また色が青になることシェーダーファイル適用されています。]

イメージ説明

cpp

1 struct Vertex 2 { 3 GLfloat position[2]; 4 //GLfloat color[4]; 5 }; 6

cpp

1#include "DrawTest.hpp" 2 3//コンストラクタ 4DrawTest::DrawTest() 5{ 6 7//////////////////////////////////////////////////////////////////////////////////////////////////// 8 //頂点座標 9 Vertex rectangleVertex[4] = 10 { 11 //頂点、頂点色 12 {-0.5f,-0.5f}, 13 {0.5f,-0.5f }, 14 {0.5f,0.5f }, 15 {-0.5f,0.5f } 16 }; 17 18 /* 19 20 //頂点座標 21 Vertex rectangleVertex[4] = 22 { 23 //頂点、頂点色 24 {-0.5f,-0.5f, 0.0,0.0,1.0,1.0}, 25 {0.5f,-0.5f , 0.0,0.0,1.0,1.0}, 26 {0.5f,0.5f , 0.0,0.0,1.0,1.0}, 27 {-0.5f,0.5f , 0.0,0.0,1.0,1.0} 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 42 //頂点 43 glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertex), rectangleVertex, GL_STATIC_DRAW); 44 glVertexAttribPointer(0, 2, GL_FLOAT,GL_FALSE, 4 * sizeof(Vertex), (GLvoid*)0); 45 glEnableVertexAttribArray(0); 46 47 48 /* 49 //頂点カラー 50 glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertex), rectangleVertex, GL_STATIC_DRAW); 51 glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(Vertex),(GLvoid*)(2 * sizeof(GLfloat))); 52 glEnableVertexAttribArray(1); 53 */ 54 55/////////////////////////////////////////////////////////////////////////////////////////////// 56 57} 58 59//更新 60void DrawTest::Update() 61{ 62 63} 64 65//描画 66void DrawTest::Draw() 67{ 68 glBindVertexArray(vao); 69 glDrawArrays(GL_LINE_LOOP, 0, 4); 70} 71 72//デストラクタ 73DrawTest::~DrawTest() 74{ 75 glDeleteVertexArrays(1, &vao); 76 glDeleteBuffers(1, &vbo); 77 78} 79 80

cpp

1#include "Shader.hpp" 2#include "DrawTest.hpp" 3 4 5int main() 6{ 7 if (glfwInit() == GL_FALSE) 8 { 9 std::cerr << "glfw初期化失敗。" << std::endl; 10 return -1; 11 } 12 13 atexit(glfwTerminate); //プログラム終了時の処理を登録 14 Window window; //コンテキストを作成 15 16 //OpenGL Verison 3.2 Core Profile を選択する 17 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3); 18 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3); 19 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE); 20 glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); 21 22 glClearColor(1.0, 0.0, 0.0, 1.0); //背景色 23// ############################################################################# 24 25 DrawTest test; 26 27 28 Shader shader("Test.vert","Test.frag"); 29 30 shader.setBindAttribVertex(0, "Position"); 31 shader.setBindAttribFragment(0, "fragment"); 32 33 34 while (window) 35 { 36 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //カラーバッファをクリア 37 shader.Active(); 38 39 test.Draw(); 40 41 window.SwapBuffers(); //ダブルバッファリング 42 } 43 44} 45

glsl

1#version 330 core 2 3in vec2 position; 4 5 6void main() 7{ 8 gl_Position = vec4(position.x,position.y,1.0,1.0); //座標 9}

cpp

1#version 330 core 2 3out vec4 fragment; 4 5 6void main() 7{ 8 fragment = vec4(0.0,0.0,1.0,1.0); 9}

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

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

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

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

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

Zuishin

2021/04/22 01:08

アカウント変更してもまた質問削除してるけど、誰かに注意されたんだろう。 そういうのを読まずに捨てるからなぜ低評価を受けるかわからないんだよ。 簡単に削除できるような質問をするんじゃない。もっと考えてから質問しろ。
guest

回答1

0

ベストアンサー

おかえりなさいませ.

glVertexAttribPointer(0, 2, GL_FLOAT,GL_FALSE, 4 * sizeof(Vertex), (GLvoid*)0);

ここの 4 * sizeof(Vertex)0 にする,すなわち
glVertexAttribPointer(0, 2, GL_FLOAT,GL_FALSE, 0, (GLvoid*)0)
としたら改善しませんでしょうか?

(あるいは,4 * を取り除いて, sizeof(Vertex) にするのでも同じかな)

投稿2021/04/21 09:11

編集2021/04/21 09:17
fana

総合スコア11632

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

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

fana

2021/04/21 09:23

この引数は, 「各頂点用のデータの(の先頭の)位置が rectangleVertex の中で何byteおきに配置されているのか?」 という意味だから, この場合,sizeof(Vertex) を指定する. で,本件のVertex型の定義を見るに,{多分,おそらく,変なことがなければ}sizeof(Vertex) は 2*sizeof(GLfloat) と同じだろうから, 0を指定して「密に並んでいる」という指定をしても良いだろう,と.
退会済みユーザー

退会済みユーザー

2021/04/21 09:59

なるほど。頂点カラーがある際のデータですが頂点二次元、float * 4 (頂点カラー),なのですがこの場合どうやってストライドすればいいのでしょか? //頂点 glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertex), rectangleVertex, GL_STATIC_DRAW); glVertexAttribPointer(0, 2, GL_FLOAT,GL_FALSE,0, (GLvoid*)0); glEnableVertexAttribArray(0); //頂点カラー glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertex), rectangleVertex, GL_STATIC_DRAW); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0,(GLvoid*)(2 * sizeof(GLfloat))); glEnableVertexAttribArray(1);
fana

2021/04/22 01:12 編集

・各頂点用の座標データが rectangleVertex の中で何バイトおきの位置にあるのか? ・各頂点用の色のデータが rectangleVertex の中で何バイトおきの位置にあるのか? という話. そういうのはちゃんと考えてみればわかる. Vertex型は(理想的(?)には)GLfloat型6個が以下のような並びになっている. 頂点(4) 頂点(4) 色(4) 色(4) 色(4) 色(4) ※ここで「(4)」とかいうのは各要素のサイズ(byte)を示していて,sizeof(GLfloat)が4なのだと仮定して書いている. さらにここでは,Vertexにはたまたま余計な余白じみた物が追加されたとして考えよう(「余計な余白…」については構造体のパディングとかの話で別途調べてください.) 例えば(実際にはこうはならないだろうけども例えとして)Vertex型が,コンパイラの気まぐれによって 頂点(4) 頂点(4) 余白(8) 色(4) 色(4) 色(4) 色(4) とかいう事態になっているとしよう. この場合,sizeof(Vertex)は32[byte]になる. rectangleVertex は Vertex型の配列だから,以下のようにこいつが並んでいるイメージだ. 頂点(4*2) 余白(8) 色(4*4) 頂点(4*2) 余白(8) 色(4*4) 頂点(4*2) 余白(8) 色(4*4) ... 記述が長くなるから頂点2個と色4個は纏めて書いたけど,この上で考えれば, ・各頂点用の座標データが rectangleVertex の中で何バイトおきの位置にあるのか? ・各頂点用の色のデータが rectangleVertex の中で何バイトおきの位置にあるのか? がわかるよね.
fana

2021/04/22 01:11

座標データも色データも,この例だと 32[byte] おきに存在している. もちろん,この32という値は,このてきとーに考えた一例の値でしかないから,実際のコードに 32 って書くのは間違いだ. 様々なパディング具合に対応できるようにするために sizeof( Vertex ) と書くことになるだろう. また,こういうことを考えると,色側の glVertexAttribPointer の最後の引数の値を > 2 * sizeof(GLfloat) としてしまうことにも不安があるね. 実際の色情報データがVertex型の先頭から何バイト目に位置するかはわからない前提でコードを書いた方がいい. このことには offsetof が使えるんじゃないかな.
fana

2021/04/22 01:29 編集

で,余談だけども, offsetof について調べれば,「PODじゃないとどうの…」とか何とかいう話が見えたりもする. (Vertex型は今は POD かもしれないけども,将来までずっとそうなのかはわからない. コンストラクタとか付けたくなるかもしれないし,もっと複雑な機能をあれこれ持つ型に変えていくことがあるかもしれない ……とか考えると,PODの制限はちょっと面倒な話に思える) 私なら,そういった Vertex型の offestof のあれこれに思いを巡らせるのは面倒だから glBufferData には,(rectangleVertexみたいな)構造体の配列を渡すんじゃなくて,単純に GLfloat型の配列に全データをきちきちに詰めて入れてそれを渡すようにするかなぁ. (それなら別に,座標と色とを一個の配列に同居させてストライドやオフセットの値を明示的に与えなくとも,別個の配列で渡してストライドやオフセットは単純に0を与えれば済むし.)
退会済みユーザー

退会済みユーザー

2021/04/22 01:32 編集

なるほど。プログラムはわかりやすく組むべきあることを忘れていました。
fana

2021/04/22 01:35 編集

うむ. なので,私なら, Vertex型の配列 rectangleVertex でデータを持っている場合, わざわざ glBufferData に渡すためだけの配列を (glBufferData を呼ぶ箇所の手前で)用意して, その配列に rectangleVertex からデータ値をせっせとコピーして, その配列を glBufferData に渡す というコードをまずは書くと思う. その様相は他者から見たら非常にナンセンスでかっこ悪い雑魚丸出しなコードに見えるかもしれないけども,誰かのために書いているんじゃなくて自分のためのコードなんだから,まずは自分にとって把握しやすい(間違いが起きにくい)ことが一番だと思うので.
fana

2021/04/22 01:41 編集

ストライドやオフセットについては,まずは自身で > 頂点(4*2) 余白(8) 色(4*4) 頂点(4*2) 余白(8) 色(4*4) 頂点(4*2) 余白(8) 色(4*4) ... みたいなのを絵にでも描いて考えるべきだし, そのためには少なくとも,このイメージを描ける必要がある. glVertexAttribPointer のリファレンスを見てストライドの説明がわからない場合,質問するにしても その自分が描いた絵を示して,「メモリイメージはこうなっているハズだけども,ストライドとはどこからどこまでのバイト数を意味するのか? 自分はここからここまでだと思ってこのようにコードを書いたのだが,ダメなようだ.解釈が違うのだろうか?」 とかいう形で質問するとよろしかろう.
fana

2021/04/22 01:47

丸投げと評されるのは,そういうのを書かないためであろう. また,書かれてないと,書かない理由が 「めんどくせぇから自分では考えない(:丸投げ)」 なのか, 「書けないから」 なのか(それとも別の何かなのか)というのが,読み手に解釈されてしまうことになる. (「書けない」と解釈した者は「基礎からやれ」と言うだろう.)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問