directx9 вопрос, возможно глупый

Devid

Поверхность задана как z(x, y) где (x, y) - квадратная сетка. Хочется нарисовать эту поверхность как сплошную и чтобы одновременно на ней была видна сетка.
Сейчас поверхность рисоуется как набор примитивов(треугольников а сетка как набор отрезков. Но буффер глубины работает не совсем хорошо, оно и понятно - ведь сетка лежит на поверхности. Поэтому сетка будет прерывистой, часть будет невидна.
Если же приподнимать чуть-чуть сетку над поверхностью, то она будет видна нормально, но будет заметно, что она лежит не на поверхности, а немного сверху.
Как кошерно добиться нужного результата?

kokoc88

Как кошерно добиться нужного результата?
Как кошерно не знаю.
Попробуй рендерить два раза с разным способом заливки:
SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

yolki

яхз как это делается кошерно, но я делал так:
рисовал примитивы закрашенные одним цветом, а бордюр примитивов - другим цветом.
например:

тут не DirectX, но аналогия, надеюсь, сработает.

Devid

Спасибо, но не помогает. В результате сетка опять получается прерывистой. Кроме того она получется треугольной, а не квадратной, но это уже частности.

Devid

А как в directx рисовать примитивы с границей?

kill-still

А наложить одно на другое нельзя?

kokoc88

А как в directx рисовать примитивы с границей?
Если тебе нужна квадратная сетка, то тебе придётся руками рисовать примитивы-линии, а не примитивы-треугольники. Смотри в сторону line strip, line list и прочее. Естественно, рисовать надо после отрисовки поверхности. (Но это и приводит к твоей проблеме...)

kokoc88

Но это и приводит к твоей проблеме...
Проблема называется Z-Fighting. Гугл подсказывает, что решить её можно с помощью projection matrix. На самом деле гугл выдаёт много результатов, но копаться в них нет времени.

Devid

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

Devid

Z-Fighting
Спасибо

nawok

Попробуй вместо линий рисовать цилиндры

правда так рендериться медленнее будет.

fufa58

в opengl это делается с помощью glPolygonOffset, можно погуглить на тему аналогов. лично у меня интернетов нету :(

bleyman

В DX этого не было, вроде (потому что это всё равно, что слегка подпатчить projection, а при таком варианте либо некоторые линии всё-таки тонут, либо некоторые линии просвечивают сквозь основу, либо одновременно .
Там, кажется, была более крутая штука: выставление операции сравнения в Z-буфере. По дефолту там "строго меньше", если поставить "меньше или равно", то всё заработает. Или если оставить её как была, но отрисовать сначала сетку, потом объект, так даже правильней.

Devid

По дефолту как раз меньше либо равно:

One member of the D3DCMPFUNC enumerated type. The default value is D3DCMP_LESSEQUAL.

Да и операцию можно и в опенгл задавать.
А вот поставить строго больше и сначала нарисовать сетку можно попробовать.

SPARTAK3959

Тогда уж лучше сразу рисовать треугольнички с текстурой - по крайней мере будет быстрее.

bleyman

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

SPARTAK3959

Я про неразумность использования цилиндров.

Devid

И текстуры и цилиндры попадают в категорию "некошерно" мне кажется.
Оставить комментарий
Имя или ник:
Комментарий: