directx щель между треугольниками

Devid

Пусть есть два треугольника ABC и BDC. Рисуются они хорошо.
Если теперь нарисовать ABC BDE и EDC, где E - середина BC, то по отрезку BC будет щель, из которой будет видно несколько пикселей.
Если же еще вставить треугольник BCE, то вместо белых пикселей будут черные. И с освещением и без.
В чем проблема?

banderon

А если ABC тоже заменить на пару треугольников ABE и AEC, то нормально будет?

Devid

Да. Но это не подходит.

kokoc88

Если теперь нарисовать ABC BDE и EDC, где E - середина BC, то по отрезку BC будет щель, из которой будет видно несколько пикселей.
Мне немного лень разбираться. Вопрос такой: все ли треугольники рисуются одинаково левосторонне или правосторонне? (По умолчанию, если ты ничего не менял, то система координат в DirectX вроде бы правосторонняя.)

Devid

Рисуется по два примитива на каждый треугольник - верхняя и нижняя грани.
Еще в первом посте я соврал - если использовать треугольник "затычку" BCE без света, то все рисуется нормально.

Dmitriy82

Потому что все эти подпрограммы рисования треугольников гарантируют только, что если рёбра в точности совпадают (начало и конец то потерянных пикселей и перекрытия между ними не будет.
Гарантировать большее действительно было бы трудновато. Например, само свойство, что два отрезка лежат строго на одной прямой, хрен сформулируешь, с учётом того что все координаты заданы с конечной точностью. А даже если сформулировать - кто сказал, что GPU обязан работать с такой же точностью?

kokoc88

Рисуется по два примитива на каждый треугольник - верхняя и нижняя грани.
Я не знаю, где у треугольника верхняя и нижняя грани. Я хотел сказать, что при некоторых обстоятельствах примитивы надо рисовать одинаково, грубо говоря, по или против часовой стрелки.
Вообще, чтобы между треугольниками не было разрывов, надо использовать стрипы (D3DPT_TRIANGLESTRIP). Тогда DirectX сам их правильно нарисует.

Devid

Стрипы не помогают. У треугольника в пространсве две грани - верхняя и нижняя. Если рисовать ABC нарисуется одна, если ACB - другая.

Devid

Потому что все эти подпрограммы рисования треугольников гарантируют только, что если рёбра в точности совпадают (начало и конец то потерянных пикселей и перекрытия между ними не будет.
Видимо так и есть. Жаль.

Dmitriy82

Т.е. по-твоему между двумя треугольниками с общим ребром возможен зазор, если вершины обходятся не в том порядке? С позиции здравого смысла порядок обхода должен влиять только на ориентацию грани (лицевая или нет). Если ты прав, у этого эффекта должны быть какие-то весьма тонкие причины. Какие?

kokoc88

по-твоему между двумя треугольниками с общим ребром возможен зазор, если вершины обходятся не в том порядке?
Может, у них могут возникать проблемы, например, с depth buffer. Вообще от этого так же зависит, кака сторона отрисовывается - лицевая или обратная. Это тоже может привести к дефектам, особенно если используешь окрашенные треугольники.

kokoc88

верхняя и нижняя
Блин, я пол часа втыкал. :) Они называются - лицевая и обратная. Font face и back face. Почему стрипы не помогают? При использовании triangle strip у тебя тоже дырки? Тогда можно попробовать обновить драйверы видеокарты.

kokoc88

Если ты прав, у этого эффекта должны быть какие-то весьма тонкие причины. Какие?
Кстати, каким алгоритмом строится прямая между двумя точками? Ведь DirectX координаты задают именно точку, а не пиксель. Точка вроде бы попадает в центр пикселя. Поэтому в DirectX есть правила растеризации, при попадании грани (edge) треугольника в центр пикселя точка может появиться, а может и не появиться.
http://msdn.microsoft.com/en-us/library/bb147314(VS.85).aspx

Serab

Стрипы не помогают. У треугольника в пространсве две грани - верхняя и нижняя. Если рисовать ABC нарисуется одна, если ACB - другая.
Если рисуешь в основном треугольники, а не многокранные объекты, можешь отключить CULL_FACE (напрямую с DirectX не работал, не знаю как там это называется и делается)

yroslavasako

на курсах по машграфу учат так не делать. В любом случае стороны не должны проходить мимо точек. Если ты разбил одно ребра на два точкой, то через эту точку нужно провести все рёбра. Почитай исходники http://www.geuz.org/gmsh/ для просветления

Serab

Если ты разбил одно ребра на два точкой, то через эту точку нужно провести все рёбра.
блин, вот реально, че-то я туплю, до этого не допер.

yroslavasako

грубо говоря, ты должен получить множество точек поверхности, тем гуще, чем больше деталей видно при текущей матрице проекции. А потом соединить их рёбрами, и получишь годную сетку. Конкретные алгоритмы разнятся, но гуглятся лекго
Оставить комментарий
Имя или ник:
Комментарий: