Как нарисовать текстуру как 2D-фон в OpenGL ES 2.0?
-
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 ваших вершин. (Подсказка: не много, если у вас не включено глубинное тестирование. И даже тогда, если у вас нет перспективной проекции, объекты не станут меньше, чем дальше, поэтому все еще покажется, как будто ничего случилось)
Через несколько дней он останавливается таким чертовски разочаровывающим, и вы, наконец, «получили его», в основном.