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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenGL

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

Q&A

解決済

2回答

1820閲覧

OpenGL(OpenTK)で四角形が意図していない方向から表示される

Rei_312

総合スコア24

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenGL

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

1グッド

0クリップ

投稿2022/03/28 04:03

実現したいこと

こんにちは。
最近OpenGL(OpenTK)の勉強を始めたので、勘違いしている点など多いかもしれませんが、
数時間試行錯誤しても解決しなかったのので質問させてください。

OpenGLを使用して赤色の四角形を描画したのですが、
カメラの位置と注視点を変更して描画すると、意図しない結果となります。
どこの指定が間違っているのか自分では判断が付かないので、
教えていただきたいです。

該当のソースコード

バーテックスシェーダー:

GLSL

1#version 460 2 3uniform mat4 viewMatrix; 4uniform mat4 projMatrix; 5uniform mat4 modelMatrix; 6 7layout (location = 0) in vec3 position; 8layout (location = 1) in vec4 color; 9 10out vec4 vColor; 11 12void main() 13{ 14 gl_Position = modelMatrix * viewMatrix * projMatrix * vec4(position, 1.0); 15 vColor = color; 16}

フラグメントシェーダー:

GLSL

1#version 460 2 3precision mediump float; 4 5in vec4 vColor; 6out vec4 fragColor; 7 8void main() 9{ 10 fragColor = vColor; 11}

C#

1//行列を設定 2public void LoadMatrices() 3{ 4 //射影行列 5  _projMatrix = Matrix4.CreatePerspectiveOffCenter(-Width / 2, Width / 2, -Height / 2, Height / 2, 0.5f, 600f); 6 //ビュー行列 7 //位置を100, 0, 130, 注視点を100, 0, 0に 8 _viewMatrix = Matrix4.LookAt( 100, 0, 130, 100, 0, 0, 0, 1, 0 ); 9 //モデル行列 10 _modelMatrix = Matrix4.Identity; 11 //128倍に拡大 12 _modelMatrix.M11 = 128; 13 _modelMatrix.M22 = 128; 14 _modelMatrix.M33 = 128; 15} 16 17protected override void OnRenderFrame( FrameEventArgs e ) 18{ 19 GL.Clear( ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit ); 20 21 //四角形の頂点 22 float[] vertices = new float[] 23 { 24 -128, 128, 0, 25 -128, -128, 0, 26 128, 128, 0, 27 128, -128, 0 28 } 29 30 //すべての頂点を赤色 31 float[] colors = new float[] 32 { 33 1f, 0f, 0f, 1f, 34 1f, 0f, 0f, 1f, 35 1f, 0f, 0f, 1f, 36 1f, 0f, 0f, 1f 37 } 38 39 //インデックス 40 short[] indices = new short[] 41 { 42 0, 1, 2, 3 43 } 44 45 //GL.UniformMatrix4( int location, bool transpose, ref Matrix4 matrix ) 46 GL.UniformMatrix4( GL.GetUniformLocation( _program, "viewMatrix" ), true, ref _viewMatrix ); 47 GL.UniformMatrix4( GL.GetUniformLocation( _program, "projMatrix" ), true, ref _projMatrix ); 48 GL.UniformMatrix4( GL.GetUniformLocation( _program, "modelMatrix" ), true, ref _modelMatrix ); 49 50 GL.EnableVertexAttribArray(0); 51 GL.EnableVertexAttribArray(1); 52 53 GL.VertexAttribPointer(1, 4, VertexAttribPointerType.Float, false, 0, colors); 54 GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, vertices); 55 56 //描画 57 GL.DrawElements( PrimitiveType.TriangleStrip, 4, DrawElementsType.UnsignedShort, indices ); 58 59 GL.DisableVertexAttribArray(0); 60 GL.DisableVertexAttribArray(1); 61 62 GL.Flush(); 63 SwapBuffers(); 64}

上記のコードにて、Matrix4.LookAtの引数に0, 0, 130, 0, 0, 0, 0, 1, 0(位置を0, 0, 130、注視点を0, 0, 0)
を指定すると、画面の中心に赤い四角形が表示されるのですが、コードにある通り、
100, 0, 130, 100, 0, 0, 0, 1, 0を指定すると、意図している結果としては、四角形が画面の左に向かって
平行移動したような結果なのですが、原点を注視点に設定しているような結果が得られます。
0, 0, 130から原点を注視点に描画した結果:
0, 0, 130から原点を注視点に描画した結果
100, 0, 130から100, 0, 0を注視点に描画した結果:
100, 0, 130から100, 0, 0を注視点に描画した結果

補足情報(FW/ツールのバージョンなど)

・OpenGLのバージョン: 4.6.0
・GPU: NVIDIA GeForce GTX 1650

cure_fontaine👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問します。
* width、Height には何を入力しているのか不明ですので、教えて下さい。
* Matrix4.CreatePerspectiveOffCenter を使っていますが、上記の変数が不定なのでこちらで現象を確認できません。
私は通常 Matrix4.CreatePerspectiveFieldOfView()を使っています。
CreatePerspectiveOffCenter の代わりにMatrix4.CreatePerspectiveFieldOfView(0.75, 1, 0.5, 600.0) では結果はどうなりますか?

投稿2022/03/28 08:01

編集2022/03/28 08:02
cure_fontaine

総合スコア137

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

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

fana

2022/03/28 08:24 編集

> width、Height には何を入力しているのか不明ですので、教えて下さい なるほど,ものすごい広角な設定になっているだけなのかもしれませんね. コードを良く見ると頂点の座標値は128でそこに128倍スケールがかかっているので,視点~原点距離(130)と比較して相当にでかいサイズになるのにこんな(四角形が小さな)絵が得られているし. (何故か回答っぽくない文章体裁になっているが,核心を突いていそうな気がするので高評価を投じておく)
cure_fontaine

2022/03/28 08:22

CreatePerspectiveOffCenter について簡単に調べてみましたが、中心をずらした射影行列を作成するようです。 これによって中心がずらされていると、原点が画面中心に来なくなる可能性があります。
fana

2022/03/28 08:33 編集

CreatePerspectiveOffCenter をググった感じ,最初の方の引数は「Near平面での」視野範囲を指定するものっぽいので, そこに突っ込んでいる Width, Height が Nearの値(0.5f)に対して非常にでかいスケールの値になっているのではないかと想像. (それでも矩形が斜めから見た感じになってる点は謎だけど)
Rei_312

2022/03/28 08:55

Matrix4.CreatePerspectiveOffCenterを提示して頂いた内容のコードに置き換えてみた所、 意図した通りの結果が得られました。Matrix4.CreatePerspectiveOffCenterメソッドについての、 理解が浅く、引数のWidth, Heightには、GameWindowの幅、高さをそのまま渡していました。 ありがとうございました。
fana

2022/03/28 09:59

> 提示して頂いた内容のコードに置き換えてみた所, というのは,別のメソッドである CreatePerspectiveFieldOfView を使うという話ですか? > Matrix4.CreatePerspectiveOffCenterメソッドについての、 理解が浅く、引数のWidth, Heightには、GameWindowの幅、高さをそのまま渡していました。 とのことですが,あくまでもググった範疇の「想像」を書いているという状況ですから,そこは鵜呑みにせずに「引数を変えたら改善した」みたいな確認をされるべきに思います. (元々使っていた CreatePerspectiveOffCenter を用いてうまくいくのであれば,別メソッドに乗り換える必要もないのでしょうし)
cure_fontaine

2022/03/28 22:41

また質問してね! ごきげんよう!
guest

0

コードの字面をぱっと見しただけですが…

gl_Position = modelMatrix * viewMatrix * projMatrix * vec4(position, 1.0);

ここ,マトリクスを乗じていく順序は妥当ですか?
マトリクスの名称から考えれば,逆順:
gl_Position = projMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);
が自然かと思いますが.

投稿2022/03/28 04:19

fana

総合スコア11658

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

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

Rei_312

2022/03/28 04:51 編集

https://stackoverflow.com/questions/11452241/opentk-matrix-transformations こちらのページに >Your OpenTK matrices are transposed by default. >It looks to use row vectors instead of column vectors. >Therefore you need to do the multiplication as (model * view * proj), >not (proj * view * model). Either that >or transpose all the matrices before uploading them. とあるので乗算の順序に関しては間違ってないと思います。 試しに順序を逆にすると、何も描画されなくなります。
fana

2022/03/28 07:22

OpenTK は触れたことが無いので,無価値な雑音になってしまったなら申し訳ないです. * Either 以降の側の話を試してみてもダメなのでしょうか? * そのリンク先で最終的な結果のコードがどうなったのかよくわかりませんが…… もしも「行ベクトルを扱う形で書かなきゃならない」のであれば,乗算の左側にベクトルが来る形になるという話だったりはしませんか? すなわち, vec4(position, 1.0) * modelMatrix * viewMatrix * projMatrix; みたいな.
fana

2022/03/28 07:25

※この回答の gl_Position = projMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); は, vec4(position, 1.0) が縦ベクトルだと思って書きました.
fana

2022/03/29 00:58 編集

質問者様へのお願い事項: お手数ではございますが,回答内容が間違っていることが明確になった場合,その旨をコメントで示していただく&低評価を投じておいていただきたく.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問