OpenGL ES отображает растровый глиф как проблемы с позиционированием текстуры - PullRequest
2 голосов
/ 25 сентября 2010

Я просто тестирую этот материал, поэтому мне не нужен альтернативный подход (без расширений 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' глиф выглядит так: alt text

Кто-нибудь знает почему?

Кстати.Я начинаю с настройки матрицы проекции для 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);

1 Ответ

2 голосов
/ 25 сентября 2010

Отображение между координатами вершины и координатами текстуры, похоже, перепутано. Попробуйте изменить координаты вашей вершины на:

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).

...