Androidアプリ開発 OpenGL ポイントスプライト 点の大きさ [Android OpenGL]
前回、ポイントスプライトでドロイド君を、たくさんの星のように表示させることができた。
しかし、「何かがおかしい」ことにお気付きだろうか。
えーと、何がおかしいかというと、どの点も同じ大きさで表示されるから。つまり遠近法が無視されているっていうこと。位置座標はちゃんと3次元なので視点の移動にともなっての移動は、ちゃんと遠近法が効いている。しかし、大きさは、glPointSizeで指定されたままの大きさで変化しないので、「なんかおかしい」っていうことになっている。
ということは、glPointSizeで指定する点の大きさを視点からの距離で計算してやればOK?
その通りです。
ですが、もっと簡単にできてしまう。OpenGL 1.1の機能になってしまうが、glPointParameterfvでGL_POINT_DISTANCE_ATTENUATIONを指定してやるだけで点の大きさが遠近法で計算されるようになる。
では、さっそくやってみよう。パラメータの設定は1回だけでよいので、onSurfaceCreatedでやってしまう。
glPointParameterfvを呼び出すには、GL11にキャストしないといけない。OpenGL1.0しかサポートしていない端末だと、多分エラーになる(CastExceptionかなぁ...ならないかも知れない)。 その辺りはケアーしていないので注意して欲しい。
glPointParameterfvの引数がFloatBufferしか受け付けないようなので、バッファを作るのが面倒なことになっているが、基本、0,0,1といったパラメータの値をセットしているだけである。
で、動かしてみたのが、以下の動画。
ちゃんと近くにあれば大きく、遠くにあれば小さく表示されるようになった。
サイト内を検索
しかし、「何かがおかしい」ことにお気付きだろうか。
えーと、何がおかしいかというと、どの点も同じ大きさで表示されるから。つまり遠近法が無視されているっていうこと。位置座標はちゃんと3次元なので視点の移動にともなっての移動は、ちゃんと遠近法が効いている。しかし、大きさは、glPointSizeで指定されたままの大きさで変化しないので、「なんかおかしい」っていうことになっている。
ということは、glPointSizeで指定する点の大きさを視点からの距離で計算してやればOK?
その通りです。
ですが、もっと簡単にできてしまう。OpenGL 1.1の機能になってしまうが、glPointParameterfvでGL_POINT_DISTANCE_ATTENUATIONを指定してやるだけで点の大きさが遠近法で計算されるようになる。
では、さっそくやってみよう。パラメータの設定は1回だけでよいので、onSurfaceCreatedでやってしまう。
@Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gl.glClearDepthf(1.0f); eyepos[0] = 0; eyepos[1] = 0; eyepos[2] = 3; Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); // テクスチャを生成 int textures[] = new int[1]; gl.glGenTextures(1, textures, 0); gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); models.add(new Model(1, 0, 0)); models.add(new Model(-1, 0, 0)); models.add(new Model(1, 0, -2)); models.add(new Model(-1, 0, -2)); ByteBuffer b = ByteBuffer.allocateDirect(3 * 4); b.order(ByteOrder.nativeOrder()); FloatBuffer distance = b.asFloatBuffer(); distance.put(new float[]{0f,0f,1f}); distance.position(0); ((GL11)gl).glPointParameterfv(GL11.GL_POINT_DISTANCE_ATTENUATION, distance); }
glPointParameterfvを呼び出すには、GL11にキャストしないといけない。OpenGL1.0しかサポートしていない端末だと、多分エラーになる(CastExceptionかなぁ...ならないかも知れない)。 その辺りはケアーしていないので注意して欲しい。
glPointParameterfvの引数がFloatBufferしか受け付けないようなので、バッファを作るのが面倒なことになっているが、基本、0,0,1といったパラメータの値をセットしているだけである。
で、動かしてみたのが、以下の動画。
ちゃんと近くにあれば大きく、遠くにあれば小さく表示されるようになった。
サイト内を検索
2012-04-18 09:16
nice!(0)
コメント(0)
Copyright Atsushi Asai Google+朝井淳
[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2015/03/03
- メディア: 単行本(ソフトカバー)
Access クエリ 徹底活用ガイド ~仕事の現場で即使える
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2018/05/25
- メディア: 大型本
コメント 0