提示コードの頂点属性の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()関数部)
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
> UV座標を正しく設定してもその逆を設定しても
正しい設定、逆の設定とはどの設定のことでしょうか
Y座標1の時は上ですがその逆をしました。
> Y座標1の時は上ですがその逆をしました。
具体的な設定を追記してください。
> その逆とはUV座標の上が1ですが。上が0という設定をしても正しくなりません
言葉が足りなかったようですが、具体的にどこに何を設定したのでしょうか
頂点情報のUV座標を変更してみました。
> 頂点情報のUV座標を変更してみました。
その設定した値を追記してください
> 正しくなりません
どうなることを期待しているのでしょうか
UV座標を様々値に変更しましたが依然として向きが提示画像のように逆になってしまいます。
> UV座標を様々値に変更しましたが依然として向きが提示画像のように逆になってしまいます。
その変更した値を試したこととして追記してください
「向きが提示画像のように逆」というのがわかりません。
画像の向き自体は正しいのではないでしょうか。
左下を基準に0,0から240,240の範囲で表示しているんですよね?
いえ。右上から0,0 240,240と指定して描画したいのですが。左下になってしまう原因が知りたい。
現状、UV座標に設定している値の意味を理解していない、ということでしょうか
理解して色々触りましたがわからないのです。
> 理解して色々触りましたがわからないのです。
色々触った上でわからないなら、それは理解していません
そもそもですが、何のために「OpenGL_FrameWork」を作っているのでしょうか
正直こんなことで躓く程度で、車輪の再発明したところで時間がもったいないと思いますが
作りたいからです。あとちょっとなので。就活に使うつもりです。
文章を修正しました。
> 作りたいからです。あとちょっとなので。就活に使うつもりです。
目的があるならよかったです
就活であればUnityやUEの勉強の方が役立ちそうですが
> 文章を修正しました。
「色々触りました」とのことですが、試したのはこれだけですか?
それと文章じゃなく、試したコードを追記していただければと思います
回答2件
あなたの回答
tips
プレビュー