После поисков в гугле нашел следующие функции:
gluSphere(...)
gluCylinder(...)
Однако, эти функции не работают в ES, как я понял, в ES существует возможность рисовать только точки, линии и треугольники.
Я видел примеры, где рисуют куб: 6 граней, каждая из которых состоит из 2-х треугольников. Окружность, кольцо, прямоугольник со скругленными углами и все прочее рисуют так же из треугольников.
Я пришел к выводу, что сферу и цилиндр тоже следует рисовать из треугольников.
Для цилиндра:
Две окружности из GL_TRIANGLES_FAN
- основания цилиндра, множество "узких" прямоугольников GL_TRIANGLES_STRIP
- для боковой поверхности цилиндра - чем больше - тем красивее и менее производительно.
Для сферы: тут сложнее, думаю, можно сделать из множества квадратов GL_TRIANGLES_STRIP
(по два треугольника на квадрат) - опять же чем таких квадратов больше, тем более гладкой должна получиться сфера.
Вопросов всего 2:
Спасибо за ответы!
Является ли верным подход к рисованию 3D тел из простых треугольников или есть более правильный способ?
учитая, что в вашем случае они будут рисоваться в смартфонах, в которых видеокарты не обладают большой производительностью по сравнению с десктопными, то треугольники это единственно верный вариант.
А вобще, кроме треугольников есть ray tracing algorithms (незнаю как на русский перевести) в основе которых лежит метод генерирации изображений при помощи испускания луча из точки наблюдения на сцену, и проверяя на пересечение каждого тела с этим лучом, например для сферы это выглядело бы так:
для каждого пикселя бросаем луч из точки наблюдения (из позиции камеры)
для каждого объекта из сцены находим точку пересечения с лучом
если точка ближайшая к камере вычисляем конечный цвет пикселя в этой точке
алгоритмы реализуются во фрагментном (или пиксельном) шейдере что требует большого количества вычислений, поэтому даже на десктопных машинах нужны большие вычислительные мощности, не говоря уже о смартфонах...
Возникнут ли проблемы при наложении текстур на такие тела, или как накладывать текстуры? :)
первая часть вопроса немного не корректна, так как проблемы конечно могут возникнуть если что то неправильно сделать. касаемо второй части вопроса - грубо говоря, текстура накладывается при помощи текстурных координат, которые должны быть определены для каждой точки тела. Точно также как и для остальных атрибутов вершины, под них выделяется буфер, или запихиваются в уже существующий буфер с остальными аттрибутами, читается изображение, связывается с этим буфером, далее отправляется вершинному шейдеру через который фрагментный получает тек координаты.
пример типичного вершинного и фрагметного шейдера для OpenGL ES
// vertex shader
precision highp float;
attribute vec4 vPosition;
attribute vec2 vtexCoord;
varying vec2 texCoord;
uniform mat4 mvp;
void main() {
gl_Position = mvp * vPosition;
texCoord = vtexCoord;
}
// fragment shader
precision highp float;
varying vec2 texCoord;
uniform sampler2D texture;
void main() {
gl_FragColor = texture2D(texture, texCoord);
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Такая задача: автоматизирую через Sikulix тесты для одного приложенияСуществует куча картинок с именами (String)
Пишу на java под android, отправляю пост запрос с данными, сервер говорит: