« 配列外アクセスしても例外が発生しない…!? | トップページ | 『100%みぞれバー グレープフルーツ』だ! »

2011年8月13日 (土)

『glViewport』の怪…

『android』で『OpenGL』を使用する以上、
表示範囲を設定するのに『glViewport』を使う。

この『glViewport』は、端末によって仕様が異なる。

正常表示な『XPERIA』と異常表示の『Ziio』を
並べて動作の確認をしてみた。

以下のような簡単なテストプログラムを実行してみる。

static int offset = -1024;
public void onDrawFrame(GL10 gl) {
...
if(offset<1024)
    offset++;
gl.glViewport(offset,0,width,height);
...
}

『XPERIA』は、最初画像が画面中央に表示されている。
だが『offset=-480』から画像が左側画面外に
移動して左から右へ移動を開始する。

この『-480』は、画面の幅ドット数。
従って、1画面分は左に隠せるって微妙な仕様。

このマイナスの値を無視して0にするのが『Ziio』。
左から引き伸ばされて行中央に表示されたら
右側に押しつぶされていく…。

これはこれで面白い効果なのだが…。

これを軽く「java」で書くとこんな感じ。
と言ってもまるっきり「c」ですが…。

void glViewport(GL10 gl,int x,int y,int width,int height)
{
    if((-width<x)&&(x<0))width=width+x;
    if(x<0)x=0;
    if(x>=DispWidth)x=DispWidth;
    if(x+width>DispWidth)width=DispWidth-x;
    if((-height<y)&&(y<0))height=height+y;
    if(y<0)y=0;
    if(y>=DispHeight)y=DispHeight;
    if(y+height>DispHeight)height=DispHeight-y;
    gl.glViewport(x,y,width,height);
}

『XPERIA』に上記の処理を噛ますと
『Ziio』と同じように表示される。

同じメソッドを呼び出したのに、完全に現象が違っている!

ガ━━━(゚Д゚;)━━━ン!

『glViewport』の説明を確認してみると
「void glViewport(GLint x,GLint y,GLsizei width,GLsizei height);」
とある。

つまり『glViewport』は、『XPERIA』には、正しく実装され
『Ziio』には、正しく実装されていない…。

多分ハードウエアのデバイスドライバーが『OpenGL』の
仕様を正しく解釈していないのでないかと想像。

正直、勘弁してくれ…。

仕様を無視したハードは、問題だろう!

ここで、はたと気が付いた!

だから『アンドロイド・マーケット』の出入り禁止なのか!

…と。

画面演出で『glViewport』は、便利に使われているはず。
これが、仕様通り動作しなのでOUTなのは、頷ける。

てな訳で『Ziio』は、基本非対応でもOKだろう。

デバッグのために買ったのに…。_| ̄|○

ちなみに、ノートタイプのアンドロイド(dynabook AZ/M5)も
同様の現象が出てたので、これもOUTって事で…。

ただ、こうした物にも対応するのなら
・マイナスの値を使用しない。
・画面外の値も使用しない。
と言うのを頭に入れて置くと良いかも。

|

« 配列外アクセスしても例外が発生しない…!? | トップページ | 『100%みぞれバー グレープフルーツ』だ! »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/52460529

この記事へのトラックバック一覧です: 『glViewport』の怪…:

« 配列外アクセスしても例外が発生しない…!? | トップページ | 『100%みぞれバー グレープフルーツ』だ! »