OpenGL ES 1.1-2.0 серьезное изменение?

#xcode #opengl-es #cocos2d-iphone #opengl-es-2.0

#xcode #opengl-es #cocos2d-iphone #opengl-es-2.0

Вопрос:

Я создаю приложение для iPhone с cocos2d и пытаюсь использовать следующий код OpenGL ES 1.1. Однако я не очень хорошо разбираюсь в OpenGL, и мое приложение использует OpenGL ES 2.0, поэтому мне нужно его преобразовать.

Поэтому мне было интересно, насколько сложно было бы преобразовать следующий код из ES 1.1 в ES 2.0? Есть ли какой-нибудь источник, который мог бы подсказать мне, какие методы нуждаются в замене и т.д.?

 -(void) draw
{
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisable(GL_TEXTURE_2D);

    glColor4ub(_color.r, _color.g, _color.b, _opacity);
    glLineWidth(1.0f);
    glEnable(GL_LINE_SMOOTH);

    if (_opacity != 255)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    //non-GL code here

    if (_opacity != 255)
        glBlendFunc(CC_BLEND_SRC, CC_BLEND_DST);

    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnable(GL_TEXTURE_2D);
}
  

Комментарии:

1. Мы говорим здесь об ES или о рабочем столе? Имеет огромное значение. В первом случае (изменить тег opengl) это будет не так просто. В последнем случае (удалите теги es) не должно быть никаких проблем с прибылью.

2. Ах да, должно быть, перечитал это. В этом случае перенос будет не таким простым, и вам нужно перейти к шейдерам GLSL.

3. О боже … этот эффект буквально занял у меня несколько минут, чтобы реализовать во Flash:/ спасибо за совет, мне, вероятно, придется искать альтернативные методы.

Ответ №1:

Это будет не так просто, если вы не очень хорошо разбираетесь в OpenGL.

В OpenGL ES 2.0 больше нет конвейера с фиксированной функцией. Это означает, что вы должны управлять преобразованиями вершин, освещением, текстурированием и тому подобным самостоятельно, используя вершинные и фрагментные шейдеры GLSL. Вы также должны самостоятельно отслеживать матрицы преобразования, больше нет glMatrixMode , glPushMatrix , glTranslate , … .

Также больше нет атрибутов вершин buitlin (например glVertex , glColor , …). Таким образом, эти функции вместе с соответствующими функциями массива (например glVertexPointer , , glColorPointer , …) и gl(En/Dis)ableClientState , также были изменены. Вместо этого вам нужны общие функции атрибутов вершин ( glVertexAttrib , glVertexAttribPointer и gl(En/Dis)ableVertexAttribArray , которые ведут себя аналогично) вместе с соответствующим вершинным шейдером, чтобы придать этим атрибутам их правильное значение.

Я предлагаю вам заглянуть в хороший учебник или книгу по OpenGL ES 2.0, поскольку перенос с 1.1 на 2.0 действительно серьезное изменение, по крайней мере, если вы никогда ничего не слышали о шейдерах.

Комментарии:

1. Хорошо, спасибо, я мог бы попробовать 2.0 с нуля. Я понимаю, что 2.0 дает больше возможностей, но не могли бы они ТАКЖЕ предоставить ярлыки 1.1? Я нахожу невероятным, что они сидели и думали: «Я знаю, в версии 2.0 мы уберем все и позволим людям делать все сами». Я не против потратить время на изучение некоторых низкоуровневых вещей, но, глядя на некоторые учебные пособия, им требуется около часа, чтобы сделать вращающийся куб. Я удивлен простым рисованием линий и т. Д., Кто-то не предложил что-то лучшее.

2. @user666254 Вы действительно правы в том, что настройка простых вещей требует больше усилий, и новичкам также сложнее учиться, поскольку вы не можете многого сделать, не понимая всего API и конвейера. Но, с другой стороны, теперь гораздо сложнее делать что-то неправильно (например glBegin/glEnd , …), а API намного чище. И вы все равно не найдете ни одного серьезного приложения, не использующего шейдеры (может быть, сегодня, но, конечно, не завтра).

3. @user666254 Что-то лучше? Новый API с аппаратным ускорением, который должны поддерживать поставщики оборудования, который обеспечивает подмножество уже существующих возможностей? Маловероятно, что это произойдет. Конечно, для простых вещей вы все равно можете использовать OpenGL ES 1.1. Но где-то должно быть сделано продвижение в будущее.