Delfigamer
> А разве не D3DBLEND_INVSRCALPHA?
Точно, и в первом параметре я тоже ошибся, там D3DBLEND_ONE должно быть :)
Mikle
> А в PNG точно ВЕСЬ спрайт жёлтый, а не только те места, где альфа ненулевая?
Да, было тупо все в одном. Исправил. Т.е. я создал желтый фон, создал для него прозрачную маску, в которой нарисовал звездочку: по сути отметил непрозрачную часть. Затем включаю альфа-тест:
DeviceDirect.SetRenderState(D3DRS_ALPHATESTENABLE, 1); DeviceDirect.SetRenderState( D3DRS_ALPHAREF, 8); DeviceDirect.SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
Все работает. Как надо. Даже фильтрацию не надо отключать.
Andrey
> Достаточно сравнения квадратов расстояния до камеры. Но в любом случае будут
> ошибки при перекрытии полигонов.
Квадратов расстояния от чего до камеры? Т.е. сначала вывести все непрозрачное, а уже потом выводить прозрачное от дальних к ближним, да еще в этот момент z-буфер отключить? И как лучше всего это вычислить?
Ramm
> Квадратов расстояния от чего до камеры?
от объектов до камеры.
>Т.е. сначала вывести все непрозрачное, а уже потом выводить прозрачное от дальних к ближним, да еще в этот момент z-буфер отключить?
отключить запись в Z Буфер, Z буфер отключать не нужно.
> И как лучше всего это вычислить?
Что вычислить? квадрат расстояния?
float distSq = dot(camPos, objectPos);
Andrey
> квадрат расстояния?
До каждой вершины полигона? Или пересечения биссектрис треугольников?
Ramm
> До каждой вершины полигона? Или пересечения биссектрис треугольников?
ты по 1 полигону рисуешь что-ли? под позицией объекта понимают позицию внутри матрицы трансформации.
Andrey
> ты по 1 полигону рисуешь что-ли? под позицией объекта понимают позицию внутри
> матрицы трансформации.
Прости, но я не догоняю...
Andrey
> float distSq = dot(camPos, objectPos);
Мдя...
Vec3 x = objectPos - camPos;
float sqrDist = dot(x,x);
innuendo
Ух ты описался, конечно же разница векторов нужна. Глянька ты, кроме тесселяции и всяких AA и понтов ты еще что-то знаешь :) Растешь!
Ramm
> Прости, но я не догоняю...
что именно не понятно?
Andrey
> кроме тесселяции и всяких AA
Что-то ещё есть в 3D ? А, импортёр из макса в свой формат :)
innuendo
> Vec3 x = objectPos - camPos;
> float sqrDist = dot(x,x);
Я правильно понимаю, что camPos - текущее положение камеры в пространстве,
dot(x,x) - это скалярное произведение векторов, наверное? Получается квадрат расстояния от камеры до objectPos. А что такое objectPos? Позиция объекта? Как можно выразить позицию полигона одной точкой?
Ramm
> А что такое objectPos? Позиция объекта?
Да
> Как можно выразить позицию полигона одной точкой?
Никак. Это техника per-object, а не per-polygon.
Можно курнуть BSP
innuendo
> Никак. Это техника per-object, а не per-polygon.
> Можно курнуть BSP
Правильно понимаю, что у нас есть, например, полупрозрачные прямоугольники (например, стекла на карте), и так как алгоритм грубый, то нам важно их среднее удаление от камеры (например, точка пересечения диагоналей) и расположение друг относительно друга, чтобы они располагались так, чтобы расстояние между ними было больше, чем погрешность алгоритма? И сортировать полигоны все равно придется.
innuendo
> Никак. Это техника per-object, а не per-polygon.
Все верно.
> Можно курнуть BSP
Мдя... Не путай человека. Причем тут это??? Если можно все проще решить?
Ramm
> Правильно понимаю, что у нас есть, например, полупрозрачные прямоугольники
> (например, стекла на карте), и так как алгоритм грубый, то нам важно их среднее
> удаление от камеры (например, точка пересечения диагоналей) и расположение друг
> относительно друга, чтобы они располагались так, чтобы расстояние между ними
> было больше, чем погрешность алгоритма?
Полупрозрачные прямоугольники это единый объект сетка(mesh) он может быть привязан к объекту, у которого есть позиция в пространстве. Сам мешь должен находиться в начале координат, точнее его геометрический центр. Тогда имея матрицу трансформации можно рисовать его в разных местах и учитывать расстояние от его до камеры и т.д.
> И сортировать полигоны все равно придется.
Если камера статична то можно 1 раз более менее правильно отсортировать полигон меша и перезаписать буферы. Но все равно будет местам неверное перекрытие, а отсюда результат блендинга и сортировкой это не решится. Но это очень редкие задачи.
Обычно пренебрегают этим и рисуют группу прозрачных треугольников объеденных в mesh, предварительно сортируют меши в составе объектов в соответствующем порядке удаления от камеры в зависимости от прозрачности.
Andrey
> Не путай человека. Причем тут это??? Если можно все проще решить?
Человек хочет per-polygon...
Ramm
> И сортировать полигоны все равно придется.
Если сильно хочется - кури OIT DX11 style
Тема в архиве.