OpenGL 3D текстуры и отображение на части четырехугольника - PullRequest
3 голосов
/ 28 января 2011

Я создаю Minecraft - ирландский движок для изучения ландшафта OpenGL и 3D, и все работает отлично, за исключением FPS, который меня не устраивает.

About 66 fps with 50k vertices/frame

Текущий : в настоящее время я рисую только видимые грани и использую отбраковку усеченного конуса, кубы имеют размеры 16 на 16 на 32 фрагмента куба (на данный момент).

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

С помощью этого метода я получаю 20-100 кадров в секунду, что не очень хорошо. Профилирование говорит, что я посылаю около 100 тыс. Вершин на видеокарту, и как только я смотрю на небо и вершины падают ниже 10 тыс., Я набираю 200 + fps, так что я думаю, что это мое узкое место.

Что я хочу сделать : Чем меньше, тем больше я пошел дальше и нашел это: http://ogre3d.org/forums/viewtopic.php?f=2&t=60381&p=405688#p404631

Из того, что я понимаю Kojack использует трехмерную сетку огромных плоскостей и каким-то образом рисует текстуры из атласа 2D-текстуры в определенных местах этих огромных плоскостей. Он говорит, что использует 3D-текстуру 256x256x256 и зеленый и синий каналы для отображения на атлас 2D-текстуры.

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

Моя проблема : Я ничего не понял, что он сказал :(, я хочу попробовать его метод, но я не понимаю, что именно он сделал, в основном я думаю, что это мой недостаток опыта в 3D текстуры (я представляю себе блок пикселей). Как он отобразил текстуру из текстурного атласа только на часть плоскости, и это с помощью какой-то 3D-карты текстур ...

Может кто-нибудь объяснить, что сделал Коджак , или указать мне какое-нибудь полезное место, даже Google сейчас не помогает.

Ответы [ 2 ]

4 голосов
/ 29 января 2011

Вот ответ на ваш вопрос.Сначала он рассматривает сцену как кубик размером 256 x 256 x 256.Для каждой оси он отображает 256 квадратов (каждый из двух треугольников) полного размера куба при каждом значении оси (т. Е. От 0,0,0 до 0,256,256, а затем от 1,0,0 до 1,256,256 и т. Д. ДоОт 256,0,0 до 256,256,256).Затем он делает то же самое, обращаясь к другому направлению - с противоположными нормалями - чтобы получить в общей сложности 512 квадратов / 1024 треугольника на ось.Этот процесс повторяется для y и z, чтобы получить в общей сложности 3072 треугольника и 3072 вершины (вершины встречаются только по краям куба 256 x 256 x 256).

Теперь текстурирование.Фактически он рисует каждый куб, но делает его невидимым, делая текстуру прозрачной в этом месте.У него есть две текстуры: трехмерная текстура 256 x 256 x 256 и атлас текстуры 16 x 16 , состоящий из более мелких текстур.Чтобы нарисовать текстуру, сначала он использует координаты куба, который он рисует, в качестве координат текстуры в трехмерной текстуре.Так что, если он рисует куб в позиции, например, 42, 7, 13, то координаты 3D-текстуры равны 42, 7, 13. Внутри 3D-текстуры все, что он хранит, это зеленые и синие значения, которые соответствуют координатам u, v элемента-текстура в текстурном атласе для рисования.Таким образом, в его примере цвет в 3D текстуре имеет вид R = 0 (не используется), G = 2, B = 4, A = 0 (не используется).Он использует 2 & 4 в качестве координат u, v, а затем рисует текстуру в позиции 2, 4 в текстурном атласе.Поскольку текстурный атлас в основном представляет собой одну огромную текстуру, которая соответствует 16 x 16 (256) меньшим текстурам, рисуется только одна из меньших текстур (в этом случае 2 и 4 будут преобразованы в координаты текстуры путем деления их на 16,поэтому они становятся 2/16 = 0,125 и 4/16 = 0,25. Они соответствуют 0,0 для суб-текстуры в положении 2,4 в атласе, а 1,1 для этой суб-текстуры составляют 0,125 + 1./ 16 и 0,25 + 1/16. Эти координаты используются для текстуры куба.

Если он хочет выкопать куб, все, что ему нужно сделать, это изменить значение, сохраненное в 3D текстуре в этой точкечтобы указать на прозрачную суб-текстуру в атласе, поэтому, если 0,0 в текстурном атласе является полностью прозрачной суб-текстурой, он может просто установить текстуру в 3D-атласе в этом месте на R = 0 (не используется), G = 0, B = 0, A = 0 (не используется).

2 голосов
/ 31 января 2011

Попробуйте поместить текстуры вашего лица в текстурный атлас .Привязка текстуры к лицу way слишком много.

...