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

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

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

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

Q&A

解決済

2回答

836閲覧

UV座標を正しく指定しても画像が逆向きに表示される原因が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

0グッド

0クリップ

投稿2021/05/27 08:26

編集2021/05/28 04:54

提示コードの頂点属性のUVデータを更新コメント部内部のコードですがUV座標を正しく設定してもなぜか画像が左下を基準に描画されるのですがこれはなぜでしょうか? 画像は480,480の画像です。画像はフリー素材です。

やりたいこと「 画像の左上を基準に描画範囲を絞って描画させいたいが現状なぜか左下を基準に描画されてしまう。 」
試したこと「タイプAではAのうに表示されタイプBではBのように表示されます。」

利用ライブラリ
opengl
glfw
glew
glmライブラリ
stbライブラリ

Github: https://github.com/Shigurechan/OpenGL_FrameWork/tree/8c5474f912d17d070cdb94c610d6192bd9a14c3a
(Sprite.cpp DrawGprah()関数部)

A
A
B
B
イメージ説明

cpp

1sprite->DrawGraph(glm::vec2(100, 100), 0, 0, glm::vec2(0, 0), glm::vec2(0,0), glm::vec2(240, 240));

cpp

1 2//描画 3void FrameWork::Sprite::DrawGraph(glm::vec2 pos, unsigned char texNum,float r,glm::vec2 s,glm::vec2 startSize,glm::vec2 endSize) 4{ 5 if (isDefaultShader == true) 6 { 7 setEnable(); 8 } 9 10 glBindVertexArray(vao); 11 glBindBuffer(GL_ARRAY_BUFFER, vbo); 12 13 setDrawTextureID((unsigned char)texNum); //テクチャーユニットを設定 14 15 // ####################### 頂点属性のUVデータを更新 ####################### 16 // 17 //UVサイズからピクセルサイズを算出 18 const float sizeX = 1.0f / (float)textureID.at(texNum).size.x; 19 const float sizeY = 1.0f / (float)textureID.at(texNum).size.y; 20 21 22 23 24//タイプA 25 //左上 26 rectangleVertex[0].uv[0] = sizeX * startSize.x; 27 rectangleVertex[0].uv[1] = 1.0f - (sizeY * startSize.y); 28 29 //左下 30 rectangleVertex[1].uv[0] = sizeX * startSize.x; 31 rectangleVertex[1].uv[1] = 1.0f - (sizeY * endSize.y); 32 rectangleVertex[4].uv[0] = sizeX * startSize.x; 33 rectangleVertex[4].uv[1] = 1.0f - (sizeY * endSize.y); 34 35 //右上 36 rectangleVertex[2].uv[0] = (sizeX * endSize.x); 37 rectangleVertex[2].uv[1] = 1.0f - (sizeY * startSize.y); 38 rectangleVertex[3].uv[0] = (sizeX * endSize.x); 39 rectangleVertex[3].uv[1] = 1.0f - (sizeY * startSize.y); 40 41 //右下 42 rectangleVertex[5].uv[0] = sizeX * endSize.x; 43 rectangleVertex[5].uv[1] = 1.0f - (sizeY * endSize.y); 44 45/* 46// タイプB 47 //左上 48 rectangleVertex[0].uv[0] = sizeX * startSize.x; 49 rectangleVertex[0].uv[1] = (sizeY * startSize.y); 50 51 //左下 52 rectangleVertex[1].uv[0] = sizeX * startSize.x; 53 rectangleVertex[1].uv[1] = (sizeY * endSize.y); 54 rectangleVertex[4].uv[0] = sizeX * startSize.x; 55 rectangleVertex[4].uv[1] = (sizeY * endSize.y); 56 57 //右上 58 rectangleVertex[2].uv[0] = (sizeX * endSize.x); 59 rectangleVertex[2].uv[1] = (sizeY * startSize.y); 60 rectangleVertex[3].uv[0] = (sizeX * endSize.x); 61 rectangleVertex[3].uv[1] = (sizeY * startSize.y); 62 63 //右下 64 rectangleVertex[5].uv[0] = sizeX * endSize.x; 65 rectangleVertex[5].uv[1] = (sizeY * endSize.y); 66*/ 67 68 69 70 71 72 73 74 75 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexUV) * 6, rectangleVertex); 76 // ################################################### 77 78 79 80 //std::cout << windowContext->getSize().x << std::endl; 81 82 //Transform 83 //printf("%f\n", rectangleVertex[2].uv[0]); 84 setSizeScale(glm::vec2(std::abs((endSize.x - startSize.x)), (std::abs(endSize.y - startSize.y)))); //サイズ 85 setScale(s); //スケール 86 setRotate(r); //回転 87 setTranslate(glm::vec3(pos.x + (getSizeScale().x / 2.0f), pos.y + (getSizeScale().y / 2.0f), 0.0f)); //平行移動 88 89 //uniform 90 setUniformMatrix4fv("uTranslate", translate); 91 setUniformMatrix4fv("uRotate", rotate); 92 setUniformMatrix4fv("uScale", scale); 93 setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, windowContext->getSize().x, windowContext->getSize().y, 0.0f, -1.0f, 1.0f)); 94 95 96 97 //バインド&描画 98 glBindTexture(GL_TEXTURE_2D, textureID.at(texNum).ID); 99 glDrawArrays(GL_TRIANGLES, 0, 6); 100 101 102 103 104 if (isDefaultShader == true) 105 { 106 setDisable(); 107 } 108 109 //バインドを解除 110 glBindVertexArray(0); 111 //glBindBuffer(GL_ARRAY_BUFFER, 0); 112 glBindTexture(GL_TEXTURE_2D, 0); 113 114} 115

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/27 09:44

> UV座標を正しく設定してもその逆を設定しても 正しい設定、逆の設定とはどの設定のことでしょうか
退会済みユーザー

退会済みユーザー

2021/05/27 09:46

Y座標1の時は上ですがその逆をしました。
退会済みユーザー

退会済みユーザー

2021/05/27 09:54

> Y座標1の時は上ですがその逆をしました。 具体的な設定を追記してください。
退会済みユーザー

退会済みユーザー

2021/05/27 10:01

> その逆とはUV座標の上が1ですが。上が0という設定をしても正しくなりません 言葉が足りなかったようですが、具体的にどこに何を設定したのでしょうか
退会済みユーザー

退会済みユーザー

2021/05/27 10:08

頂点情報のUV座標を変更してみました。
退会済みユーザー

退会済みユーザー

2021/05/27 10:19

> 頂点情報のUV座標を変更してみました。 その設定した値を追記してください > 正しくなりません どうなることを期待しているのでしょうか
退会済みユーザー

退会済みユーザー

2021/05/27 10:34

UV座標を様々値に変更しましたが依然として向きが提示画像のように逆になってしまいます。
退会済みユーザー

退会済みユーザー

2021/05/27 10:43

> UV座標を様々値に変更しましたが依然として向きが提示画像のように逆になってしまいます。 その変更した値を試したこととして追記してください 「向きが提示画像のように逆」というのがわかりません。 画像の向き自体は正しいのではないでしょうか。 左下を基準に0,0から240,240の範囲で表示しているんですよね?
退会済みユーザー

退会済みユーザー

2021/05/27 11:09

いえ。右上から0,0 240,240と指定して描画したいのですが。左下になってしまう原因が知りたい。
退会済みユーザー

退会済みユーザー

2021/05/27 11:13

現状、UV座標に設定している値の意味を理解していない、ということでしょうか
退会済みユーザー

退会済みユーザー

2021/05/27 11:21

理解して色々触りましたがわからないのです。
退会済みユーザー

退会済みユーザー

2021/05/27 11:38

> 理解して色々触りましたがわからないのです。 色々触った上でわからないなら、それは理解していません そもそもですが、何のために「OpenGL_FrameWork」を作っているのでしょうか 正直こんなことで躓く程度で、車輪の再発明したところで時間がもったいないと思いますが
退会済みユーザー

退会済みユーザー

2021/05/27 12:01

作りたいからです。あとちょっとなので。就活に使うつもりです。
退会済みユーザー

退会済みユーザー

2021/05/27 12:26

文章を修正しました。
退会済みユーザー

退会済みユーザー

2021/05/27 14:08

> 作りたいからです。あとちょっとなので。就活に使うつもりです。 目的があるならよかったです 就活であればUnityやUEの勉強の方が役立ちそうですが > 文章を修正しました。 「色々触りました」とのことですが、試したのはこれだけですか? それと文章じゃなく、試したコードを追記していただければと思います
guest

回答2

0

(完全にエスパー回答ですが)

テクスチャに使う画像のデータの並び順(glTexImage2Dあたりに与えるデータ列の並び順)に由来しているのではないでしょうか.

例えば,WindowsのBitmapとかだと左下が(0,0)という形になっているので,そのPixelデータをファイルからそのままの順序で読み出して左上が(0,0)な系で使おうとすると,上下が逆になったりします.


例えば,3*3 の画像が,見た目には

A B C D E F G H I

という形だとして,
画像ファイルのフォーマットとして左下が原点である場合,そのファイルには画素値データが
{ G,H,I, D,E,F, A,B,C }
の順に並んでいる.

これをそのまま読み出して glTexImage2D に与えたとしたら,
テクスチャの(U,V)座標に対する画素値の並びは以下のようになる.

+────→ U │G H I │D E F │A B C ↓ V

…的なことになっていたりしませんか?

投稿2021/05/28 00:57

編集2021/05/28 01:07
fana

総合スコア11663

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

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

退会済みユーザー

退会済みユーザー

2021/05/28 04:55

提示コードを修正しました。それも試しましたが画像が反転されてしまいます。
guest

0

ベストアンサー

2点指定なのに、暗黙的に「startSize」は左上を選択することになってるのがダサいですね。
せめて判定をかませてどちらも受け取れるようにすべきかと。
個人的には、左上の点、幅と高さを指定するほうが矩形選択としては好きです。

cpp

1//左上 2rectangleVertex[0].uv[0] = sizeX * startSize.x; 3rectangleVertex[0].uv[1] = sizeY * endSize.y; 4 5//左下 6rectangleVertex[1].uv[0] = sizeX * startSize.x; 7rectangleVertex[1].uv[1] = sizeY * startSize.y; 8rectangleVertex[4].uv[0] = sizeX * startSize.x; 9rectangleVertex[4].uv[1] = sizeY * startSize.y; 10 11//右上 12rectangleVertex[2].uv[0] = sizeX * endSize.x; 13rectangleVertex[2].uv[1] = sizeY * endSize.y; 14rectangleVertex[3].uv[0] = sizeX * endSize.x; 15rectangleVertex[3].uv[1] = sizeY * endSize.y; 16 17//右下 18rectangleVertex[5].uv[0] = sizeX * endSize.x; 19rectangleVertex[5].uv[1] = sizeY * startSize.y;

上記は質問中の画像とコードから考えた、机上のコードです。
「1.0f」から引いてる箇所を削除し、上下を入れ替えてあります。
そもそもに使い方がよくないなど、それらの問題は考慮しておりません。

投稿2021/05/27 14:20

編集2021/05/28 02:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/05/28 00:31

それを座標を指定する際に左上になるようにUV座標を指定したいのです。
退会済みユーザー

退会済みユーザー

2021/05/28 00:58

あなたの試したコードを追記してください どれくらい理解していて、試したことが正しいのか判断できません 少なくとも、UV座標にどのような値を設定すれば、期待した動作をするかぐらいは理解しているんですよね > rectangleVertex[0].uv[1] = 1.0f - (sizeY * startSize.y); なぜ、「1.0f」から引いているのかとか説明できますか?
退会済みユーザー

退会済みユーザー

2021/05/28 04:58

Y座標は上が1なのたとえば0.4という値が来たらYの上が1なので全体(1.0f)を引くと0.6が来るのでその値がYが上が1の時のY座標のUV位置です。
退会済みユーザー

退会済みユーザー

2021/05/28 05:12 編集

日本語がおかしいです。 > Y座標は上が1なの > たとえば0.4という値が来たらYの上が1なので > 全体(1.0f)を引くと0.6が来るので > その値がYが上が1の時のY座標のUV位置です。 「1.0f」から引いていることについてですが、「1.0f」を引くのはなぜですか? やってる処理についてじゃなくて、やってる理由についてです (処理はコードをみればわかるので) 少なくとも私のこの回答のコードであなたの期待する動作にはなると思いますが、 試していないということでよろしいでしょうか
退会済みユーザー

退会済みユーザー

2021/05/28 05:23

試しまたが正しい状態になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問