2011年8月23日火曜日

ApiDemoのGLSurfaceViewについて調査してみました

ステップ1、頂点を定義する。
サンプル中のint型の配列verticesは立方体の8つの頂点座標を指定している。
3つ区切りで、3次元の(x,y,z)の座標を表す。
此の時点では頂点だけが有るだけで、辺や面はまだ無いイメージ

ステップ2、頂点ごとに色を定義する
同じくint型の配列colorsで指定されている。
こちらは4つ区切りで、それぞれ(R,G,B,alpha)を表しているみたい。
vertices
と対応している

ステップ3、インデックスを定義
配列indicesでインデックス(というか面?)を定義しています。
3つの数字の組が12個あり、それぞれが1つの三角形の面となります。
ここで使われている数字はステップ1のvertices配列のインデックスに対応します。
つまり、一つ目の面 0, 4, 5は頂点(-one, -one, -one)(-one, -one, one)(one, -one, one)の3つの頂点からなる面を表します。

この時注意すべき事は、面には裏表が有るという事です。
どちらが表で、どちらが裏かは頂点を指定する順番に寄ります。
頂点を時計回りの順番で指定したときと、反時計回りで指定したときでは表裏が逆になります。
詳しくはこちらのURLを見てみるとわかりやすいかも
http://www.komoto.org/opengl/sample10.htm

com.exampleandroid.apis.graphics.Cube

01./**

02.* A vertex shaded cube.

03.*/

04.class Cube

05.{

06.public Cube()

07.{

08.int one = 0x10000;

09.int vertices[] = {//頂点情報。1点につきx,y,z軸の3つの情報がいるため、ここで定義してるのは8点分。

10.-one, -one, -one, //indexからみると0

11.one, -one, -one, //indexからみると1

12.one,  one, -one, //indexからみると2

13.-one,  one, -one, //indexからみると3

14.-one, -one,  one, //indexからみると4

15.one, -one,  one, //indexからみると5

16.one,  one,  one, //indexからみると6

17.-one,  one,  one, //indexからみると7

18.};

19. 

20.int colors[] = { //色情報。R,G,B,A(透過率)の4情報もってて、8点分。verti順番に対応

21.0,    0,    0,  one,

22.one,    0,    0,  one,

23.one,  one,    0,  one,

24.0,  one,    0,  one,

25.0,    0,  one,  one,

26.one,    0,  one,  one,

27.one,  one,  one,  one,

28.0,  one,  one,  one,

29.};

30. 

31.byte indices[] = { //vertecesで定義した頂点情報を元に図形を定義。glDrawElementsにてTRIANGLESを指定してるので、三角形で表現していく。よって3点ずつで図形を形成していく。

32.0, 4, 5,    0, 5, 1,

33.1, 5, 6,    1, 6, 2,

34.2, 6, 7,    2, 7, 3,

35.3, 7, 4,    3, 4, 0,

36.4, 7, 6,    4, 6, 5,

37.3, 0, 1,    3, 1, 2

38.};

39. 

40.// Buffers to be passed to gl*Pointer() functions

41.// must be direct, i.e., they must be placed on the

42.// native heap where the garbage collector cannot

43.// move them.

44.//

45.// Buffers with multi-byte datatypes (e.g., short, int, float)

46.// must have their byte order set to native order

47. 

48.ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4); //メモリ確保

49.vbb.order(ByteOrder.nativeOrder()); //今の環境がリトルエンディアンかビッグエンディアンかを指定

50.mVertexBuffer = vbb.asIntBuffer(); //intbufferですよ。

51.mVertexBuffer.put(vertices); //頂点情報ぶっこみます。

52.mVertexBuffer.position(0); //現在位置を最初に戻す。

53. 

54.ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length*4); //メモリ確保。ガベコレガン無視。

55.cbb.order(ByteOrder.nativeOrder());

56.mColorBuffer = cbb.asIntBuffer(); //色情報

57.mColorBuffer.put(colors);

58.mColorBuffer.position(0);

59. 

60.mIndexBuffer = ByteBuffer.allocateDirect(indices.length);

61.mIndexBuffer.put(indices); //頂点情報の順番を指定してるindex配列を渡す。

62.mIndexBuffer.position(0);

63.}

64. 

65.public void draw(GL10 gl)

66.{

67.gl.glFrontFace(gl.GL_CW); //カリング指定。こっち向いてる面(時計周り)しか描画しないよ。

68.gl.glVertexPointer(3, gl.GL_FIXED, 0, mVertexBuffer); //頂点情報を設定

69.gl.glColorPointer(4, gl.GL_FIXED, 0, mColorBuffer); //色情報を設定

70.gl.glDrawElements(gl.GL_TRIANGLES, 36, gl.GL_UNSIGNED_BYTE, mIndexBuffer); //三角形で36点を指定する。(三角形二つで四角の面を形成。キューブをあらわすのに6面いるので、3(三角形の頂点の数)*2*6=36点となる)

71.}

72. 

73.private IntBuffer   mVertexBuffer;

74.private IntBuffer   mColorBuffer;

75.private ByteBuffer  mIndexBuffer;

76.}

 

0 件のコメント:

コメントを投稿