2

私はこれをテストしているだけなので、別のアプローチは必要ありません(GL拡張機能はありません)。誰かが私のGLESの使い方に明らかな間違いを見つけてくれることを願っています。

32x32よりも小さいグリフのビットマップ(幅と高さは必ずしも2の累乗ではありません)を取得して、レンダリングできるようにテクスチャに入れたいと思います。最初に空の32x32テクスチャを作成してから、ピクセルをより大きなテクスチャにコピーします。

Gluint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTextImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 32, 32, 0,
              GL_ALPHA, GL_UNSIGNED_BYTE NULL);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bitmap.width(), bitmap.height(),
                GL_ALPHA, GL_UNSIGNED_BYTE, bitmap.pixels());

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParamteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParamteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

次に、テクスチャ座標を使用して、テクスチャのビットマップ部分のみを描画しようとします。

const GLfloat vertices[] = {
  x + bitmap.width(), y + bitmap.height(),
  x, y + bitmap.height(),
  x, y,
  x + bitmap.width(), y
};

const GLfloat texCoords[] = {
  0, bitmap.height() / 32,
  bitmap.width() / 32, bitmap.height() / 32,
  0, 0,
  bitmap.width() / 32, 0
};

const GLushort indices[] = { 0, 1, 2, 0, 2, 3 };

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);

これで、すべてがうまくいけば、頂点によって作成される正方形のサイズは、テクスチャのビットマップ部分と同じサイズになり、ビットマップが正確に描画されます。

たとえば、私のグリフが16x16だったとすると、32x32テクスチャの左下の象限を占めるはずです。その場合、texCoordsは(0、0.5)、(0.5、0.5)、(0、0)、および(0.5、0)で正しいように見えます。

ただし、私の12x12の「T」グリフは次のようになります。代替テキスト

誰もが理由を知っていますか?

ところで。まず、2D作業用の投影行列を次のように設定します。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, 480, 800, 0.0f, 0.0f, 1.0f);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslate(0.375f, 0.375f, 0.0f); // for exact pixelization

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_ALPHA);
glEnable(GL_TEXTURE_2D);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
4

1 に答える 1

2

頂点座標とテクスチャ座標の間のマッピングが混同されているようです。頂点座標を次のように変更してみてください。

const GLfloat vertices[] = {
  x, y + bitmap.height(),
  x + bitmap.width(), y + bitmap.height(),
  x, y,
  x + bitmap.width(), y
};

余談ですが、あなたの場合、頂点インデックスを経由する必要はないと思います。より簡単なのは、glDrawArraysの呼び出しです。

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

(すでにglVertexPointerとglTexCoordPointerを設定しているため)。

于 2010-09-25T07:04:29.977 に答える