122
> Кстати замечу, что был шокирован низким фпс на мобильном i7 Кипара, из #738. И
> это проц не планшетный даже, а классом выше, мобильный.)
Угу, я тоже был огорчен. И в конкурсе то не участвовал после того как увидел что у меня заливка пустым фоном на i7 дает 100фпс, списал на свою криворукость и дальше не стал пробовать.
Vitorio
> А поиск ближайшего куба как выполняется? По формуле от координат расположения камеры?
Конечно, тут даже не поиск, а вычисление.
Vitorio
> Однократным нажатием клавиши я отсортировывал сцену и далее смотрел на fps без
> затрат на сортировку. Влияние на fps было порядка 1-2 fps при 800x600.
Достаточно эффективно получилось.
Vitorio
> Сделал проверку на CCW расположение вершин полигона еще до этапа растеризации
Оно вообще не нужно в данном случае. У меня массив входных данных vCube() - всего 8 вертексов, для одного куба, даже не 24, с учётом разных текстурных координат. Текстурные координаты добавляются при умножении вертекса на матрицу трансформации - TexVTransform. Причём координаты не 0..1, а 0..16, чтобы при выборке не домножать на ширину текстуры в пикселях. Видимость сторон куба определяется заранее исходя из координат камеры и куба, рассчитываются вертексы только видимых сторон, у них CCW по определению положительный.
Public Sub DrawCube(C As tCube)
Const CubeHSZ As Single = 0.25 ' Полуразмер куба
Dim M1 As Matrix
RD.pTex = C.Tex ' Указатель на текстуру
MatrixTranslation M1, -C.Pos.x, -C.Pos.y, -C.Pos.z
MatrixMultiply M1, M1, MView
If CamPos.z < C.Pos.z - CubeHSZ Then ' Фронт
TexVTransform vScr(0), vCube(6), M1, 0, 0
TexVTransform vScr(1), vCube(7), M1, 16, 0
TexVTransform vScr(2), vCube(4), M1, 0, 16
TexVTransform vScr(3), vCube(5), M1, 16, 16
DrawTriangle vScr(), 0, 1, 3
DrawTriangle vScr(), 0, 3, 2
ElseIf CamPos.z > C.Pos.z + CubeHSZ Then ' Тыл
TexVTransform vScr(0), vCube(2), M1, 0, 0
TexVTransform vScr(1), vCube(3), M1, 16, 0
TexVTransform vScr(2), vCube(0), M1, 0, 16
TexVTransform vScr(3), vCube(1), M1, 16, 16
DrawTriangle vScr(), 0, 1, 3
DrawTriangle vScr(), 0, 3, 2
End If
If CamPos.y > C.Pos.y + CubeHSZ Then ' Верх
TexVTransform vScr(0), vCube(0), M1, 0, 0
TexVTransform vScr(1), vCube(1), M1, 16, 0
TexVTransform vScr(2), vCube(4), M1, 0, 16
TexVTransform vScr(3), vCube(5), M1, 16, 16
DrawTriangle vScr(), 0, 1, 3
DrawTriangle vScr(), 0, 3, 2
ElseIf CamPos.y < C.Pos.y - CubeHSZ Then ' Низ
TexVTransform vScr(0), vCube(2), M1, 0, 0
TexVTransform vScr(1), vCube(3), M1, 16, 0
TexVTransform vScr(2), vCube(6), M1, 0, 16
TexVTransform vScr(3), vCube(7), M1, 16, 16
DrawTriangle vScr(), 0, 1, 3
DrawTriangle vScr(), 0, 3, 2
End If
If CamPos.x > C.Pos.x + CubeHSZ Then ' Правая сторона
TexVTransform vScr(0), vCube(0), M1, 0, 16
TexVTransform vScr(1), vCube(2), M1, 0, 0
TexVTransform vScr(2), vCube(4), M1, 16, 16
TexVTransform vScr(3), vCube(6), M1, 16, 0
DrawTriangle vScr(), 0, 1, 3
DrawTriangle vScr(), 0, 3, 2
ElseIf CamPos.x < C.Pos.x - CubeHSZ Then ' Левая сторона
TexVTransform vScr(0), vCube(1), M1, 0, 16
TexVTransform vScr(1), vCube(3), M1, 0, 0
TexVTransform vScr(2), vCube(5), M1, 16, 16
TexVTransform vScr(3), vCube(7), M1, 16, 0
DrawTriangle vScr(), 0, 1, 3
DrawTriangle vScr(), 0, 3, 2
End If
End SubMikle
> Конечно, тут даже не поиск, а вычисление.
Хороший способ.
> Причём координаты не 0..1, а 0..16, чтобы при выборке не домножать на ширину
> текстуры в пикселях.
Я тоже использовал данный приём.
> Видимость сторон куба определяется заранее исходя из координат камеры и куба,
> рассчитываются вертексы только видимых сторон, у них CCW по определению
> положительный.
Попробую у себя сделать так же, посмотрю, насколько поднимет fps. Изначально не хотел на это завязываться так как тогда куб нельзя будет вращать. Я рендер писал скорее для себя, чем для победы в конкурсе. Поэтому выбирал более универсальные методы рендеринга и методы дающие наилучшее качество картинки. Может на нём потом игру сделаю, а может и нет:)
122
> Та же история!
Будет ли 3D игра от sb3d ?:)
Vitorio
> Будет ли 3D игра от sb3d ?:)
Это сложный и долгий вопрос. Наверное, тут ему не совсем место.
Вспоминаются мысли о софтовом shadow mapping и/или deferred shading.
Раз есть готовый растеризатор - можно будет поиграться.
Сделал версию без генерации спанов в памяти, это SSE2 без хака
[file=118862]
Многопоточность не работает, полигоны вблизи пропадают, ТАК НАДО
Hardcode
> Сделал версию без генерации спанов в памяти, это SSE2 без хака
104 фпс
TarasB
Хз как ее больше ускорить алгоритмически, не завязываясь на сцену (квады вместо треугольников и т.д.)
Может в выходные PGO сделаю, если влом не будет.
У меня 125 фпс (твоя последняя конкурсная 127)
А напомни, сколько твоя самая лучшая у тебя фпс дает.
Hardcode
> А напомни, сколько твоя самая лучшая у тебя фпс дает.
Вий 136, моя 8-битка 130. Хотя я тоже ПВС могу приделать методом Монте-Карло без гарантий. Чем дольше будет строиться ПВС, тем больше гарантий, лол.
Hardcode
> Сделал версию без генерации спанов в памяти, это SSE2 без хака
> Release
Отстает от моего.
Около 153 у Тараса из #706 поста.
Около 141 у меня.
Около 139 у тебя.
Да, и раз уж такая пьянка пошла. А давайте без simd? Мои всегда и были без симд, чтобы на мамонтах работать. Так что, ну, просто чтобы уж сравнить. И потом, Квейки и Анриалы тоже без simd были. А на sse2, ну дык ясен пень быстрее.
llvm'у крышу сносит, когда sse совсем выключаешь и он генерит совсем уж невменяемые портянки
Еще и в cw постоянно долбится зачем-то.
фпс в 3 раза при этом падает по сравнению с sse1 (при этом разница между sse1 и avx2 где-то 10-15%)
Hardcode
Жаль. Наверное, косяк реализации llvm. Так-то вики говорит, что для тебя есть целых 4 компилятора, в том числе и на gcc.
Версия без SSE:
swc2
Деление (double-extended) на пиксель.
122
> косяк реализации llvm.
Я думаю, они просто забили на поддержку fpu (sse1 - 99 год, даже у Тараса селерон умел его)
122
> в том числе и на gcc.
Он не работает под виндой
Тема в архиве.
Тема закрыта.