Привет всем!
Помогите с такой проблемой. рисую несколько билбордов (квадрат из двух треугольников смотрящий всегда в камеру то есть), на них части одной большой текстуры (т.е. большая картинка порезана на несколько мелких кускочков — каждый на свой биллборд). биллборды спозиционированы стык в стык — т.е. где заканчивается один начинается другой. но вот при отпределенных растояниях (причем расстояния разные в зависимости от разрешения) между границами биллбордов просвечивает фон! одна тонкая полоска в пиксель, такое ощущение что луч света просвечивает через края биллборда. думаю понятно что имеется в виду. анаолгичные проблемы я видел со скайбоксами в некоторых играх — под определенными углами между квадратами скайбокса светит полоса цвета фона в один пиксел.
собственно вопрос — как с этим бороться?
Здравствуйте, casual, Вы писали:
C>OpenGL? DirectX? может вобще софтверный рендерер?
Тьфу ты блин. это был я. увольняясь с предыдущей работы взял себе другой ник чтобы не засветьится у начальства читающего эти же форумы... прошу прощения, на разных компах разные куки оказались
Re: тайлинг биллбордов
От:
Аноним
Дата:
19.09.06 07:56
Оценка:
Здравствуйте, IPv6, Вы писали:
IP>Привет всем! IP>Помогите с такой проблемой. рисую несколько билбордов (квадрат из двух треугольников смотрящий всегда в камеру то есть), на них части одной большой текстуры (т.е. большая картинка порезана на несколько мелких кускочков — каждый на свой биллборд). биллборды спозиционированы стык в стык — т.е. где заканчивается один начинается другой. но вот при отпределенных растояниях (причем расстояния разные в зависимости от разрешения) между границами биллбордов просвечивает фон! одна тонкая полоска в пиксель, такое ощущение что луч света просвечивает через края биллборда. думаю понятно что имеется в виду. анаолгичные проблемы я видел со скайбоксами в некоторых играх — под определенными углами между квадратами скайбокса светит полоса цвета фона в один пиксел. IP>собственно вопрос — как с этим бороться? :???
а если вершины соприкасаемых сторон билбордов позырить? различаются хоть в одном бите? тогда копировать одни в другие чтобы не различались
если не различаются, будем думать
Здравствуйте, IPv6, Вы писали:
IP>собственно вопрос — как с этим бороться?
Если под Д3Д то посмотри IDirect3DDevice9::SetRenderState и D3DRS_LASTPIXEL.
Под OGL тоже что-то подобное должно быть
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: тайлинг биллбордов
От:
Аноним
Дата:
19.09.06 18:28
Оценка:
Здравствуйте, IPv6, Вы писали:
IP>Привет всем! IP>Помогите с такой проблемой. рисую несколько билбордов (квадрат из двух треугольников смотрящий всегда в камеру то есть), на них части одной большой текстуры (т.е. большая картинка порезана на несколько мелких кускочков — каждый на свой биллборд). биллборды спозиционированы стык в стык — т.е. где заканчивается один начинается другой. но вот при отпределенных растояниях (причем расстояния разные в зависимости от разрешения) между границами биллбордов просвечивает фон! одна тонкая полоска в пиксель, такое ощущение что луч света просвечивает через края биллборда. думаю понятно что имеется в виду. анаолгичные проблемы я видел со скайбоксами в некоторых играх — под определенными углами между квадратами скайбокса светит полоса цвета фона в один пиксел. IP>собственно вопрос — как с этим бороться?
Увеличь размеры билбордов на небольшую величину
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, IPv6, Вы писали:
IP>>Привет всем! IP>>Помогите с такой проблемой. рисую несколько билбордов (квадрат из двух треугольников смотрящий всегда в камеру то есть), на них части одной большой текстуры (т.е. большая картинка порезана на несколько мелких кускочков — каждый на свой биллборд). биллборды спозиционированы стык в стык — т.е. где заканчивается один начинается другой. но вот при отпределенных растояниях (причем расстояния разные в зависимости от разрешения) между границами биллбордов просвечивает фон! одна тонкая полоска в пиксель, такое ощущение что луч света просвечивает через края биллборда. думаю понятно что имеется в виду. анаолгичные проблемы я видел со скайбоксами в некоторых играх — под определенными углами между квадратами скайбокса светит полоса цвета фона в один пиксел. IP>>собственно вопрос — как с этим бороться? А>Увеличь размеры билбордов на небольшую величину
Спасибо за ответы!
После череды экспериментов выход был найден!
я сначала думал что это от смешивания текстуры с цветом вертекса, но отключение смешивания тоже ничего не изменило.
на самой текстуре полос по краям нет — выгружал битмап из карты чтобы проверить (вдруг при передаче на карту в ней чтонибудь подшаманивается)
попробовал:
— LASTPIXEL — не помогло
— координаты стык в стык — не помогло
— соотв. увеличить биллборды/расположить их в нахлест — не помогло + появляются видимые искажения в общей картинке (которая как раз на соствные биллборды и порезана).
но зато это навело на мысль, которая помогла побороть проблему — похимичить с текстурными координатами.
в результате установки координат (на каждом тайле) вместо (0,0)-(1,1) в (0.001,0.001)-(0.999,0.999) полосы по краям исчезли!
еще не проверял под всеми разрешениями но видимо растеризатор странно себя ведет когда край текстуры совпадает с краем триангла.
Спасибо!
Здравствуйте, Selevan, Вы писали:
S>Здравствуйте, casual, Вы писали:
C>>OpenGL? DirectX? может вобще софтверный рендерер?
S>сорри! дирекс-х 8 S>а с опенглем такого не бывает?
Бывает. Но я встречал исключительно при "неявных стыках". Например, ребро образуется тремя (!!!) полигонами:
* вклад первого полигона — ребро с координатами (0, 0, 0) — (200, 0, 0)
* вклад второго полигона — ребро с координатами (0, 0, 0) — (100, 0, 0)
* вклад третьего полигона — ребро с координатами (100, 0, 0) — (200, 0, 0)
Просвет будет почти всегда. Хотя, вроде и не должно быть...
Здравствуйте, IPv6, Вы писали:
А>>Увеличь размеры билбордов на небольшую величину
IP>но зато это навело на мысль, которая помогла побороть проблему — похимичить с текстурными координатами. IP>в результате установки координат (на каждом тайле) вместо (0,0)-(1,1) в (0.001,0.001)-(0.999,0.999) полосы по краям исчезли! IP>еще не проверял под всеми разрешениями но видимо растеризатор странно себя ведет когда край текстуры совпадает с краем триангла.
Не скажу, что это выход. Проблемы на лицо — неточности. Если это допускается, то можно и пропустить. Но не всегда можно их допустить
Здравствуйте, IPv6, Вы писали:
IP>Привет всем! IP>Помогите с такой проблемой. рисую несколько билбордов (квадрат из двух треугольников смотрящий всегда в камеру то есть), на них части одной большой текстуры (т.е. большая картинка порезана на несколько мелких кускочков — каждый на свой биллборд). биллборды спозиционированы стык в стык — т.е. где заканчивается один начинается другой. но вот при отпределенных растояниях (причем расстояния разные в зависимости от разрешения) между границами биллбордов просвечивает фон! одна тонкая полоска в пиксель, такое ощущение что луч света просвечивает через края биллборда. думаю понятно что имеется в виду. анаолгичные проблемы я видел со скайбоксами в некоторых играх — под определенными углами между квадратами скайбокса светит полоса цвета фона в один пиксел.
Это текстуртайлинг называется. IP>собственно вопрос — как с этим бороться?
Выключи интерполяцию.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, IPv6, Вы писали:
IP>но зато это навело на мысль, которая помогла побороть проблему — похимичить с текстурными координатами. IP>в результате установки координат (на каждом тайле) вместо (0,0)-(1,1) в (0.001,0.001)-(0.999,0.999) полосы по краям исчезли! IP>еще не проверял под всеми разрешениями но видимо растеризатор странно себя ведет когда край текстуры совпадает с краем триангла.
Нормально он себя ведёт, с чем по вашему должны интерполироваться цвета краевых пикселов?
Если хотите задавать вручную (как раз ваш случай) CLAMP EDGE, создаёте текстуру размером (N+2) на (M+2), т.е. по краям на 1 пиксел больше и заполняете эджи цветами соседних краевых пикселов ваших биллбордов. И как вы заметили, нужно установить правильные текстурные координаты, к примеру, для верхнего левого угла они будут такие:
U = 1/(N+2);
V = 1/(M+2);
Для правого нижнего, соответственно:
U = 1-1/(N+2);
V = 1-1/(M+2);
Тогда биллборды будут правильно интерполироваться между собой.
Но есть небольшая тонкость, к примеру, эджи вообще крайних биллбордов должны заполняться цветами краевых пикселов этого же биллборда, а угловые пиксела на этих эджах — не у гловыми краевыми пикселами этого билборда, а угловыми краевымм пикселами смежных с ним.
<Freespace>
Billboard1 Billboard2
---------+ +---------
1231231 3|<-->|1 3453453 <- программный CLAMP EDGE или просто едж/бордер
-------+ | | +-------
1231231|3|<-->|1|3453453 <- краевые пикселы, полезная область текстуры
Числами показаны цвета пикселов.
Но вот если ещё будет включён MIPMAP, то начнутся проблемы, т.к. нет способа устанавливать разные кроп координаты для разных уровней мипмапа.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]