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

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

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

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

C++

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

Q&A

解決済

2回答

1898閲覧

[OpenGL] UV座標を指定して画像を切り抜き描画させる方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2021/05/08 08:46

提示コードの////コメント部ですがUV座標画像のサイズで割ってここからここまでといった感じで切り抜いて描画したいのですが上手く描画されません画像のUV座標を使って切り抜くにはどうすればいいのでしょうか?

![イメージ説明]

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 //UVサイズからピクセルサイズを算出 11 float sizeX = 1.0f / textureID.at(textureNumber).size.x; 12 float sizeY = 1.0f / textureID.at(textureNumber).size.y; 13 14 ////////////////////////////////////////////////////////////////////////////////////////////////// 15 //左上 16 rectangleVertex[0].uv[0] = sizeX * startSize.x; 17 rectangleVertex[0].uv[1] = 1.0f - (sizeY * startSize.y); 18 19 //左下 20 rectangleVertex[1].uv[0] = sizeX * startSize.x; 21 rectangleVertex[1].uv[1] = 1.0f - sizeY * ((endSize.y - startSize.y) + startSize.y); 22 rectangleVertex[4].uv[0] = sizeX * startSize.x; 23 rectangleVertex[4].uv[1] = 1.0f - sizeY * ((endSize.y - startSize.y) + startSize.y); 24 25 //右上 26 rectangleVertex[2].uv[0] = sizeX * endSize.x; 27 rectangleVertex[2].uv[1] = 1.0f - sizeY * ((startSize.y - endSize.y) - endSize.y); 28 rectangleVertex[3].uv[0] = sizeX * endSize.x; 29 rectangleVertex[3].uv[1] = 1.0f - sizeY * ((startSize.y - endSize.y) - endSize.y); 30 31 //右下 32 rectangleVertex[5].uv[0] = sizeX * endSize.x; 33 rectangleVertex[5].uv[1] = 1.0f - sizeY * endSize.y; 34 35 glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(Transform_2D::VertexUV) * 6,rectangleVertex); //頂点データを再変更 36 ///////////////////////////////////////////////////////////////////////////////////////////////////////// 37 38 setDrawTextureID((unsigned char)texNum); //テクチャーユニットを設定 39 glBindVertexArray(vao); 40 glBindTexture(GL_TEXTURE_2D, textureID.at(texNum).ID); 41 42 43 // Transform 44 setTranslate(glm::vec3(pos.x + (textureID.at(texNum).size.x / 2.0f), pos.y + (textureID.at(texNum).size.y / 2.0f), 0.0f)); //平行移動 45 setRotate(r); //回転 46 setScale(s); //スケール 47 48 //uniform 49 setUniformMatrix4fv("uTranslate", translate); 50 setUniformMatrix4fv("uRotate", rotate); 51 setUniformMatrix4fv("uScale", scale); 52 setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, windowContext->getSize().x, windowContext->getSize().y, 0.0f, -1.0f, 1.0f)); 53 54 glDrawArrays(GL_TRIANGLES, 0, 6); 55 56 57 glBindVertexArray(0); 58 glBindTexture(GL_TEXTURE_2D, 0); 59 60 if (isDefaultShader == true) 61 { 62 setDisable(); 63 } 64 65} 66

cpp

1 Transform_2D::VertexUV rectangleVertex[6] = 2 { 3 //頂点、頂点色 4 {-0.5f,0.5f, 0.0f,1.0f}, 5 {-0.5f,-0.5f, 0.0f,0.0f}, 6 {0.5f,0.5f, 1.0f,1.0f}, 7 8 {0.5f,0.5f, 1.0f,1.0f}, 9 {-0.5f,-0.5f, 0.0f,0.0f}, 10 {0.5f,-0.5f, 1.0f,0.0f}, 11 }; 12

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

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

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

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

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

guest

回答2

0

「setDrawTextureID()」内でtextureNumber変数の設定を行ってるので上に動かせばいいのではないでしょうか。

cpp

1// ここへ移動 2setDrawTextureID((unsigned char)texNum);//テクチャーユニットを設定 3 4//UVサイズからピクセルサイズを算出 5float sizeX = 1.0f / textureID.at(textureNumber).size.x; 6float sizeY = 1.0f / textureID.at(textureNumber).size.y; 7 8////////////////////////////////////////////////////////////////////////////////////////////////// 9//左上 10rectangleVertex[0].uv[0] = sizeX * startSize.x; 11rectangleVertex[0].uv[1] = 1.0f - (sizeY * startSize.y); 12 13//左下 14rectangleVertex[1].uv[0] = sizeX * startSize.x; 15rectangleVertex[1].uv[1] = 1.0f - sizeY * ((endSize.y - startSize.y) + startSize.y); 16rectangleVertex[4].uv[0] = sizeX * startSize.x; 17rectangleVertex[4].uv[1] = 1.0f - sizeY * ((endSize.y - startSize.y) + startSize.y); 18 19//右上 20rectangleVertex[2].uv[0] = sizeX * endSize.x; 21rectangleVertex[2].uv[1] = 1.0f - sizeY * ((startSize.y - endSize.y) - endSize.y); 22rectangleVertex[3].uv[0] = sizeX * endSize.x; 23rectangleVertex[3].uv[1] = 1.0f - sizeY * ((startSize.y - endSize.y) - endSize.y); 24 25//右下 26rectangleVertex[5].uv[0] = sizeX * endSize.x; 27rectangleVertex[5].uv[1] = 1.0f - sizeY * endSize.y; 28 29glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(Transform_2D::VertexUV) * 6,rectangleVertex);//頂点データを再変更 30///////////////////////////////////////////////////////////////////////////////////////////////////////// 31 32// ここから 33//setDrawTextureID((unsigned char)texNum);//テクチャーユニットを設定

投稿2021/05/08 13:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/05/09 10:10

質問ですがUV座標を使った画像の切り抜き描画はそもそも可能なのでしょうか?
退会済みユーザー

退会済みユーザー

2021/05/09 10:59

その部分からなのですか……
退会済みユーザー

退会済みユーザー

2021/05/10 01:09

出来ると思ったのですができないのでそもそもできるのかなって思いました。
退会済みユーザー

退会済みユーザー

2021/05/10 01:59

https://learnopengl.com/Getting-started/Textures このサイトの先頭にある、正方形の画像を三角形にマッピングしているようなイメージでしょうか。 上記URLは参考サイトとしてすでに目を通していると思います。 単体の機能として、確認は行ったのですよね? > 出来ると思ったのですができないのでそもそもできるのかなって思いました。 何を根拠に「出来ると思った」のでしょうか。 「やってほしいことだけを記載した丸投げの質問」の指摘の通りですが、 動きもしない半端なソースコード載せるぐらいならな、ほかにもっと書くべきことがあるのではないでしょうか。
guest

0

ベストアンサー

引数のtextNumとは別の変数(textNumber)を使用されていませんか?

C++

1 //UVサイズからピクセルサイズを算出 2 float sizeX = 1.0f / textureID.at(textureNumber).size.x; 3 float sizeY = 1.0f / textureID.at(textureNumber).size.y;

投稿2021/05/08 09:08

Serbonis

総合スコア581

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問