Отображение изображений в открытых форматах 2.0 на iPhone - PullRequest
3 голосов
/ 25 ноября 2010

Итак, я только начал работать над чем-то в Open GL ES 2.0. У меня складывается общее впечатление, что переход с шаблона 1.1 на шаблон 2.0 в XCode вызвал некоторую путаницу у всех, поэтому в 2.0 мало что может помочь (если есть что-то действительно хорошее и информативное, например 71squared видео по шаблону 1.1, кроме 2.0, вы можете опубликовать ссылку на него).

Моя проблема заключается в отображении изображения на экране.

Прямо сейчас, у меня есть это в моем методе drawFrame.

[(EAGLView *)self.view setFramebuffer];

// Replace the implementation of this method to do your own custom drawing.
    static float transY = 0.0f;

glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
 [playerCube drawAtPoint:CGPointMake(160.0f, 240.0f)];


if ([context API] == kEAGLRenderingAPIOpenGLES2)
{
    // Use shader program.
    glUseProgram(program);

    // Update uniform value.
    glUniform1f(uniforms[UNIFORM_TRANSLATE], (GLfloat)transY);
    transY += 0.075f; 


    // Validate program before drawing. This is a good check, but only really necessary in a debug build.
    // DEBUG macro must be defined in your debug configurations if that's not already the case.

    if (![self validateProgram:program])
    {
        NSLog(@"Failed to validate program: %d", program);
        return;
    }
}
else
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0f, (GLfloat)(sinf(transY)/2.0f), 0.0f);
    transY += 0.075f;
 }

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);



[(EAGLView *)self.view presentFramebuffer];

По сути шаблон без квадрата подпрыгивая. Это в моем ViewController.m кстати. Это прекрасно работает само по себе. Однако мне не очень повезло с кодом для отображения изображения. Я использую файл Texture2D из примера аварийной посадки Apple, но мне не очень повезло с этим, независимо от того, где находится код, связанный с изображением.

Я использовал playerCube = [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"Cubix.png"]]; для его выделения, что, вероятно, правильно, даже если я не поместил его в нужное место, и [playerCube drawAtPoint:CGPointMake(160.0f, 240.0f)];.

Подождите, это не показало бы ничего в начале, потому что я не установил высоту и ширину изображения, верно? Я думаю, что вроде как ответил на эту часть моего вопроса. Будет ли это работать, если я использую что-то вроде image.frame = CGRectMake (); или это не будет работать с текстурой 2D? Кроме того, где я должен поместить этот код, чтобы он работал, как это было бы?

Надеюсь, у меня был какой-то смысл в этом. Я никогда не публиковал вопрос о StackOverflow.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

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

. Я описываю работу вершинных и фрагментных шейдеров, а также весь поддерживающий их код в видео для класса OpenGL ES 2.0.который является частью моего свободно доступного курса по разработке iOS на iTunes U .Кроме того, я настоятельно рекомендую вам прочитать серию опубликованных глав Джеффа Ламарша из его неопубликованной книги OpenGL ES 2.0.

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

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, myTexture);
glUniform1i(myTextureUniform, 0);   

В вашем фрагментном шейдере вам нужно определить форму текстуры:

uniform sampler2D myTexture;

, а затем выполнить примерцвет текстуры в соответствующей точке:

gl_FragColor = texture2D(myTexture, textureCoordinate);

Опять же, я более подробно расскажу об этом в своем классе, и вы можете использовать эти примеры в качестве отправных точек для работы.

2 голосов
/ 26 ноября 2010

Texture2D, как представлено в Crash Landing, не будет работать с ES 2.x.Он должен правильно загрузить вашу текстуру, но два метода рисования drawAtPoint: и drawInRect: не будут работать.Они полагаются на вызовы GL glVertexPointer и glTexCoordPointer;ни один из них не выживает в ES 2.x.Логика заключается в том, что ES 1.x имеет фиксированный конвейер, поэтому у него есть определенный слот для позиций вершин (который вы предоставляете glVertexPointer), определенный слот для координат текстуры (через glTexCoordPointer) и рядпредопределенные способы обработки этих данных.ES 2.x полностью программируемый, поэтому ему не нужно предоставлять один способ для предоставления вершин, другой для предоставления координат текстуры, третий для цветов и т. Д. У него есть только один способ предоставить атрибут для вершины, и это довам нужно указать, как это относится к вашей программе вершин, а затем к вашей программе вершин, чтобы выяснить, что нужно обработать и передать в ваш фрагментный шейдер.

На самом деле вы не должны путать предоставление текстур и предоставлениегеометрия в любом случае.Crash Landing был отозван, потому что он предлагает плохие шаблоны программирования - лично я подозреваю, что это был один из них.

В дополнение к отсутствию фиксированных атрибутов вершины, ES 2.x не предоставляет никаких шейдеров фрагментов.,Если вы хотите текстурировать карту, вы должны написать подходящие вершинные и фрагментные шейдеры.Те, что в новом шаблоне GL, затеняют по методу Гуро, только если я вспоминаю.

Еще одна проблема, на которую намекает код, заключается в том, что в ES 2.x отсутствует матричный стек.Вы должны сами что-то сделать, чтобы сообщить своему вершинному шейдеру, как он должен отображаться из исходных вершин в местоположения экрана.Я подозреваю, что если вы просто хотите нарисовать текстуру как 2d, это не такая большая проблема.

Вероятно, правильный путь вперед:

  • измените Texture2D такчто он может связать загруженную текстуру и удалить все попытки ее нарисовать
  • изменить вершинный и фрагментный шейдер, предоставленный в шаблоне GL, для текстурирования и изменить буфер, который вы отправляете, чтобы в нем были координаты текстуры
  • затем измените вершинный шейдер так, чтобы вы могли делать что-то кроме синусоидальной анимации

Если вы уже довольны ES 1.x, вероятно, хорошее место для начала это справочный лист ES 2.x и, возможно, учебник по lighthouse3d GLSL - хотя это для настольных компьютеров OpenGL 2.0.На настольном компьютере GL 2.0 в GLSL встроена большая поддержка для эмуляции старого фиксированного конвейера.Ничего из этого нет в ES 2.x.Но это должно, по крайней мере, объяснить, что такое атрибуты, униформа, сэмплеры и т. Д. Боюсь, мне еще не приходилось сталкиваться с ориентированным на ES 2.x руководством.

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