2010-03-30 2 views
1

Я использую свою графику iPhone с помощью OpenGL. В одном из моих проектов мне нужно использовать изображение, которое мне нужно использовать в качестве текстуры в OpenGL. Изображение .png - это размер 512 * 512, его фон прозрачный, а изображение имеет синюю синюю линию в центре.Что мы можем использовать вместо смешивания в OpenGL ES?

Когда я применяю свое изображение к многоугольнику в OpenGL, текстура выглядит так, как если бы прозрачная часть изображения была черной, а густая синяя линия видна как сама. Для того, чтобы удалить черную часть, я использовал смешение:

glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

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

Но я хочу добавить много таких образов и сделать много объектов в OpenGL. Я могу это сделать, но частота кадров очень низкая, когда я добавляю все больше изображений к объектам. Но когда я комментирую смешение, частота кадров нормальная, но изображения не видны.

Поскольку у меня нет хороших кадров, графика немного медленная, и я получаю шаткий эффект.

Итак:

1) Есть ли другой способ, чем смешивание, чтобы решить мою проблему?

2) Как повысить частоту кадров моего приложения OpenGL? Какие шаги необходимо предпринять для правильной реализации моей графики?

ответ

0

Если вы хотите иметь прозрачные части объекта, единственный способ состоит в смешении с данными пикселей для треугольника с тем, что в настоящее время находится в буфере (что вы сейчас делаете). Как правило, при использовании сплошных текстур новые пиксельные данные для треугольника просто перезаписывают то, что когда-либо было в буфере (до тех пор, пока оно является закрывающим, то есть z-буфером). Но с прозрачностью он начинает смотреть на прозрачность той части текстуры, смотреть на то, что стоит за ней, вплоть до чего-то твердого. Затем объедините все эти слои над прозрачными материалами, пока не получите окончательное изображение.

Если вы хотите, чтобы ваша прозрачность была чем-то вроде простого дерева спрайта и удаляла «материал» с боков ствола и т. Д. Тогда вам может быть лучше предоставить более сложную геометрию, которая на самом деле определяет форму ствола и, следовательно, не нужно беспокоиться о прозрачности.

К сожалению, я не думаю, что вы можете сделать многое, чтобы ускорить ваш FPS, а затем сократить количество прозрачности, которую вы вычисляете. Возможно, даже добавив некоторую оптимизацию, которая проверяет изображения, чтобы увидеть, может ли он включить альфа-смешение для этого изображения или нет. В зависимости от того, сколько вы пытаетесь проталкивать, это может сэкономить время на долгое нарушение.

+0

Спасибо за ваш ответ. Здесь, в моем проекте, я использую 512 * 512 текстур, с которыми почти 90% являются прозрачной частью. Таким образом, по вашим словам, кажется, что я могу уменьшить прозрачный процент текстуры, я могу увеличить скорость. Это хорошая информация для меня. Но, делая это, я получаю свои объекты чуть больше на экране iphone, как мы видим. Так что, похоже, нет другого способа, кроме смешивания в opendl inorder, чтобы удалить черную часть текстур ..? – quint

+0

Вместо того, чтобы смешивать, вы можете попробовать альфа-тестирование, которое может быть немного быстрее, когда вам не нужно смешиваться, и просто хотите полностью непрозрачные и полностью прозрачные области. 'GlEnable (GL_ALPHA_TEST); glAlphaTest (GL_LESS, 1.0) 'отбрасывает все пиксели, которые не являются 100% непрозрачными. Я бы не ожидал, что это придаст большой прирост производительности, поскольку рендеринг на основе плитки по-прежнему не может отбрасывать скрытые пиксели так, как может, когда альфа не происходит. – codewarrior

+0

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

Смежные вопросы