私はこれをテストしているだけなので、別のアプローチは必要ありません(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);