Как нарисовать текстуру как 2D-фон в OpenGL ES 2.0?

StackOverflow https://stackoverflow.com/questions/4036737

  •  26-09-2019
  •  | 
  •  

Вопрос

Я просто начинаю с OpenGL ES 2.0, что я хотел бы сделать, это создать простую 2D-вывод. Учитывая разрешение 480x800, как я могу нарисовать фоновую текстуру?

Моя среда развития - Java / Android, поэтому примеры напрямую относятся к этому бы лучше, но другие языки будут в порядке.

Это было полезно?

Решение

Несмотря на то, что вы находитесь на Android, я создал приложение для iPhone, которое делает это для кадров видео. Вы можете скачать код для этого образца из здесь. Отказ У меня есть запись об этом приложении, которое делает отслеживание объектов на основе цветов, используя живое видео, которое вы можете прочитать здесь.

В этом приложении я рисую два треугольника для генерации прямоугольника, затем текстуру, используя следующие координаты:

   static const GLfloat squareVertices[] = {
        -1.0f, -1.0f,
        1.0f, -1.0f,
        -1.0f,  1.0f,
        1.0f,  1.0f,
    };

    static const GLfloat textureVertices[] = {
        1.0f, 1.0f,
        1.0f, 0.0f,
        0.0f,  1.0f,
        0.0f,  0.0f,
    };

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

attribute vec4 position;
attribute vec4 inputTextureCoordinate;

varying vec2 textureCoordinate;

void main()
{
    gl_Position = position;
    textureCoordinate = inputTextureCoordinate.xy;
}

и следующий фрагмент шейда:

varying highp vec2 textureCoordinate;

uniform sampler2D videoFrame;

void main()
{
    gl_FragColor = texture2D(videoFrame, textureCoordinate);
}

Рисунок - это простое дело использования правильной программы:

glUseProgram(directDisplayProgram);

Установка формы текстуры:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, videoFrameTexture);

glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);   

Установка атрибутов:

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_FLOAT, 0, 0, textureVertices);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);

а затем нанесение треугольников:

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

Другие советы

Вы на самом деле не рисуете фона, вместо этого вы нарисуете прямоугольник (или, даже правильнее: два треугольника, образующие прямоугольник) и установите текстуру к этому. Это совсем не отличается от рисования любого другого объекта на экране.

Есть много мест, показывающих, как это сделано, возможно, есть даже проект пример Android, показывающий это.

Тященая часть - что-то отображать перед или за чем-то еще. Для этого необходимо работать, вам необходимо настроить буфер глубины и включить тестирование глубины (Glenable (GL_DEPTH_TEST)). И ваши вершины должны иметь координату Z (и сказать Gldrawelements, что ваши вершины состоят из трех значений, не два).

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

Мой совет - не иметь фонового изображения или делать что-нибудь фантазия, пока вы не получите его. OpenGL ES 2.0 имеет вид крутой кривой обучения, а учебные пособия на ES 1.x на самом деле не помогают получать 3D на работу, потому что они могут использовать вспомогательные функции, такие как Glupperspection, который не имеет. Начните с создания треугольника на фоне ничего. Далее сделай его квадратом. Затем, если вы хотите уже пойти, добавьте текстуру. Играть с позициями. Посмотрите, что происходит, когда вы изменяете значение Z ваших вершин. (Подсказка: не много, если у вас не включено глубинное тестирование. И даже тогда, если у вас нет перспективной проекции, объекты не станут меньше, чем дальше, поэтому все еще покажется, как будто ничего случилось)

Через несколько дней он останавливается таким чертовски разочаровывающим, и вы, наконец, «получили его», в основном.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top