🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

OpenGL

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

1015閲覧

iPhoneアプリでのポリゴン描画が正しく行われません

JpTomari

総合スコア4

C#

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

OpenGL

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2021/01/28 11:08

前提

現在iPhone並びにiPadにて、ポリゴン描画処理を実装しております。
ここで、以下の関数を利用してポリゴン描画を行っているのですが、指定したはずの領域にポリゴンが描画されません。

試したこと

以下のソースにおけるDrawPolygonに、_x=0,_y= 0,_w=mWidth,_h=mHeightを入れた、画面全体を覆うポリゴンの表示は
正しい描画が確認できています。

ただ、画面全体でない任意の値を入れた場合、表示がされていない、もしくは領域外に表示が行われている可能性がでており
想定した通りの処理になっておりません。

同様に、MakeVertexBufferで生成されるデバイス正規化座標を、GL.VertexPointerで直値指定する処理も試みましたが
失敗しております。

該当のソースコード

C#

1 //=================================================== 2 // ポリゴン描画 3 //=================================================== 4 public void DrawPolygon(int _x, int _y, int _w, int _h, float rr, float gg, float bb, float aa) 5 { 6 // テクスチャのバインドを外す 7 GL.Disable((All)EnableCap.Texture2D); 8 GL.BindTexture(All.Texture2D, 0); 9 10 // ポリゴン描画 11 GL.Color4(rr, gg, bb, aa); 12 GL.VertexPointer(3, All.Float, 0, MakeVertexBuffer(_x, _y, _w, _h)); 13 GL.TexCoordPointer(2, All.Float, 0, MakeFullSizeUVBuffer()); 14 GL.DrawArrays(All.TriangleStrip, 0, 4); 15 16 // テクスチャを有効に戻す 17 GL.Enable((All)EnableCap.Texture2D); 18 } 19 20 //=================================================== 21 // 頂点バッファの生成 22 //=================================================== 23 public float[] MakeVertexBuffer(int _x, int _y, int _w, int _h) 24 { 25 // ウィンドウ座標を正規デバイス座標に変換 26 float left = ((float)_x / (float)mWidth ) * 2.0f - 1.0f; 27 float top = ((float)_y / (float)mHeight) * 2.0f - 1.0f; 28 float right = ((float)(_x + _w) / (float)mWidth ) * 2.0f - 1.0f; 29 float bottom = ((float)(_y + _h) / (float)mHeight) * 2.0f - 1.0f; 30 31 // 頂点バッファの生成 32 float[] vertexs = 33 { 34 left, top, 0.0f, //頂点0 35 left, bottom, 0.0f, //頂点1 36 right, top, 0.0f, //頂点2 37 right, bottom, 0.0f, //頂点3 38 }; 39 return MakeFloatBuffer(vertexs); 40 } 41 42 //=================================================== 43 // 100%サイズUVバッファの生成 44 //=================================================== 45 public float[] MakeFullSizeUVBuffer() 46 { 47 float[] fullSize = 48 { 49 0.0f, 0.0f, 50 0.0f, 1.0f, 51 1.0f, 0.0f, 52 1.0f, 1.0f, 53 }; 54 return MakeUVBuffer(fullSize); 55 } 56 57 //=================================================== 58 // UVバッファの生成 59 //=================================================== 60 public float[] MakeUVBuffer(float[] uv) 61 { 62 return MakeFloatBuffer(uv); 63 } 64 65 //=================================================== 66 // float配列をFloatBufferに変換 67 //=================================================== 68 public float[] MakeFloatBuffer(float[] array) 69 { 70 return (array); 71 }

補足

処理内のmWidth、mHeightは、デバイスのピクセル幅となります(ポイント値ではありません)。
動作確認は、VisualStudio 2019のエミュレータ、iPad Air(4th generation)で行っております。

それでは以上、何かお気付きの点がございましたら、どうぞご指摘をお願いいたします。

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

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

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

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

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

hoshi-takanori

2021/01/28 14:32

「画面全体でない任意の値」とは具体的にどんな値で、どのような結果になってるのでしょうか?
JpTomari

2021/01/28 18:32

閲覧、ありがとうござます。 指定座標及び結果としましては… _x=0, _y=0, _w=640, _h=640 → 画面内に表示されず _x=500, _y=270, _w=640, _h=640 → 画面内に表示されず …と言った具合です。 iPad Airのpixel領域は、1640x2360となっていますので、十分に画面内のはずなのですが…。 なお、2つ目の値をMakeVertexBufferに通した場合は… left:約-0.35 top:約-0.77 right:約0.35 bottom:約-0.22 …の値を取りましたので、それを直接GL.VertexPointerで指定しましたが、こちらも失敗しています。
hoshi-takanori

2021/01/28 21:56

うーん、よく分かりませんね。_x = 0, _y = 0, _w = mWidth, _h = mHeight が表示されるなら、そこから少しずつ値を変化させて (_x, _y, _w, _h を全部いっぺんに変化させるのではなく、どれか一つだけ 10 ずつ増減するなど) 様子を見るといいのでは。
JpTomari

2021/01/29 05:27

ご指摘ありがとうございます。 早速いくつかパターンを作って表示されるパターンなどを調べてみました。 結果、どうやらViewPortの指定に誤りがあったようです。 詳細は解決方法に記述しておきますので、今後の参考にしていただけましたら幸いです。 この度は、アドバイス本当にありがとうございました。
guest

回答1

0

自己解決

自己解決いたしました。

今回の問題は、ViewPortをPixel幅指定していたことが原因です。
これによって、描画領域が本来の領域の倍になってしまい、本現象が起こっておりました。

基本的に、iOSでのViewPort指定はPoint値で指定しなければならないため、様々な画像の描画座標や縦横幅の指定について、正確な値の変換を行うよう留意する必要があると痛感しました。

今回はhoshi-takanori氏のご指摘によって、解決の糸口を掴むことができました。
改めて感謝いたします。

それでは以上、もし同様の問題に悩む方の手助けになれば幸いです。
ありがとうございました。

投稿2021/01/29 05:35

JpTomari

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問