ページ 11

iPhone OpenGL ES 1.1でのglDrawElementsについて

Posted: 2011年7月08日(金) 12:13
by iPhone-Kun
iPhoneのOpenGL ES1.1にて256X256pxのサイズの正方形を8X8個の正方形(128個の三角形)で表現したいのですが、表示した結果、下記の画像のようにギザギザの四角形になってしまいます。
画像

なお、頂点データ、インデックスで表現したいと考えています。
下記の方法で頂点データとインデックスを作成しています。
座標は320X480に設定しています。
glOrthof(0.0f, 320.0f, 480.0f, 0.0f, 0.5f, -0.5f);

コード:

const GLuint RECT_W = 256;
const GLuint RECT_H = 256;
// 分割数
const GLuint SEGMENT_W = 8;
const GLuint SEGMENT_H = 8;

GLuint numVertices = (SEGMENT_W + 1) * (SEGMENT_H + 1) * 2;
GLfloat* _vertices = new GLfloat[numVertices];
GLuint* _indices = new GLuint[SEGMENT_W * (6 * SEGMENT_H)];

uint i=0;
uint x=0;
uint y=0;

GLfloat w = RECT_W / SEGMENT_W;
GLfloat h= RECT_H / SEGMENT_H;
for (x = 0; x <= SEGMENT_W; ++x) {
for (y = 0; y <= SEGMENT_H; ++y) {
i = (y * (SEGMENT_W + 1) + x) * 2;
_vertices[i] = w * x;
_vertices[i + 1] = h * y;
}
}
for (x = 0; x < SEGMENT_W; ++x) {
i = (x * (6 * SEGMENT_H));//GL_TRIANGLESで三角形を制作するため、6つのインデックスを指定する。

for (y = 0; y < SEGMENT_H; ++y) {
_indices[i + y * 6 + 0] = (y + 0) * (SEGMENT_W + 1) + (x + 0);
_indices[i + y * 6 + 1] = (y + 0) * (SEGMENT_W + 1) + (x + 1);
_indices[i + y * 6 + 2] = (y + 1) * (SEGMENT_W + 1) + (x + 0);
_indices[i + y * 6 + 3] = (y + 0) * (SEGMENT_W + 1) + (x + 1);
_indices[i + y * 6 + 4] = (y + 1) * (SEGMENT_W + 1) + (x + 0);
_indices[i + y * 6 + 5] = (y + 1) * (SEGMENT_W + 1) + (x + 1);
}
}
表示の部分は下記のように記載しています。

コード:

glVertexPointer(2, GL_FLOAT, 0, _vertices);
glColor4f(0.0f,1.0f,1.0f,1.0f);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawElements(GL_TRIANGLES ,SEGMENT_W * (6 * SEGMENT_H)*2, GL_UNSIGNED_SHORT , _indices);

上記の方法で作成したデータを頂点とインデックスを組み合わせ、頂点だけのデータに変更した場合、
glDrawArraysを利用すると正常に四角形が出来上がりました。また、ActionScriptのDrawTrianglesに頂点データとインデックスデータを利用したところまったく問題なく四角形が書けているため、皆目見当がつきません。
おそらく表示部分に非常識なことをしているのだと思います。

お分かりになる方がおられたらご教示願えませんでしょうか。
よろしくお願いいたします。

Re: iPhone OpenGL ES 1.1でのglDrawElementsについて

Posted: 2011年7月08日(金) 17:34
by iPhone-Kun
失礼いたしました。
自己解決です。

GLuint* _indices = new GLuint[SEGMENT_W * (6 * SEGMENT_H)];

iPhoneではGL_UNSIGNED_SHORTを利用するため、インデックスもその型に合わす必要が有り下記のように修正することで対応できました。

GLushort* _indices = new GLushort[SEGMENT_W * (6 * SEGMENT_H)];