Что я делаю, что не нужно? (iPhone, OpenGL ES) - PullRequest
0 голосов
/ 13 июня 2009

Я использую OpenGL ES, чтобы рисовать вещи в моей игре для iPhone. Иногда мне нравится изменять альфа текстур, которые я рисую . Вот (рабочий) код, который я использую. Что, если вообще, в этом примере кода не нужно? Спасибо!

    // draw texture with alpha "myAlpha"
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_COMBINE );
    glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB,GL_MODULATE);
    glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB,GL_PRIMARY_COLOR);
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB,GL_SRC_COLOR);
    glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB,GL_TEXTURE);
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB,GL_SRC_COLOR);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glEnable(GL_BLEND);
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    glColor4f(myAlpha, myAlpha, myAlpha, myAlpha);

    glPushMatrix();
    glTranslatef(xLoc, yLoc, 0);
    [MyTexture drawAtPoint:CGPointZero];
    glPopMatrix();

    glColor4f(1.0, 1.0, 1.0, 1.0);

Edit:

Приведенный выше пример кода предназначен для рисования с измененным альфа-значением (чтобы я мог постепенно выводить объекты) Когда я просто хочу нарисовать без изменения значения альфа, я бы использовал последние 5 строк приведенного выше примера без последнего вызова glColor4f.

Ответы [ 3 ]

2 голосов
/ 17 июня 2009

У вас есть вызовы для настройки как текстурной среды, так и смешивания кадрового буфера, которые представляют собой совершенно разные функции. Вы также вызываете glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, x) дважды перед рисованием, поэтому имеет значение только второй вызов.

Если все, что вы действительно хотите сделать, это умножить основной цвет на цвет текстуры, то это так же просто, как glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE). Остальные вызовы glTexEnv не нужны.

2 голосов
/ 17 июня 2009

Мой рисунок выглядит так:

glBindTexture(GL_TEXTURE_2D, tex->name); // bind to the name
glVertexPointer(3, GL_FLOAT, 0, vertices); // verices is the alignment in triangles
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); // coordinates describes the rectangle
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //draw

Трудно понять, что вы можете удалить, не зная точно, что вы пытаетесь сделать.

редактирование:

Если вы не отключите blend в какой-то момент, вы можете избавиться от всех вызовов blend:

glEnable(GL_BLEND);
glBlendFunc...

Поместите их в инициализацию вашего состояния GL, если вам нужно установить его один раз. Если вам нужно включить и отключить, лучше установить состояние один раз для всего, что вам нужно, чтобы нарисовать смешанный, а затем снова установить состояние (один раз) для не смешанного.

OpenGL - это конечный автомат , поэтому эта общая идея применима везде, где вам необходимо изменить состояние GL (например, настройка текстурной среды с помощью glTexEnvf).

О конечных автоматах:

Текущее состояние определяется прошлым состояния системы. Как таковой, он может быть сказано записать информацию о прошлое, т.е. оно отражает вклад изменения от начала системы до текущий момент. Переход указывает изменение состояния и описывается условие, которое должно быть выполняется для включения перехода.

2 голосов
/ 14 июня 2009

Я не эксперт, но я читал Оптимизация OpenGL ES для iPhone OS , и там был раздел «Оптимизация текстурирования», который может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...