| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Degenerate triangles by glDisable(GL_CULL_FACE) |
| Автор: Magistrus 26.8.2013, 11:52 |
| В OpenGl в режиме glDisable(GL_CULL_FACE) отображаются вырожденные треугольники в стрипах, подскажите пожайлуста, как можно этого избежать. Отображение двух сторон примитива необходимо. Добавление второй обратной геометрии не приемлимо. |
| Автор: Bitter 26.8.2013, 13:34 |
| Что такое вырожденные треугольники в стрипах? |
| Автор: Alexeis 26.8.2013, 14:17 |
| Bitter, Есть 2 метода для уменьшения размеров массива вершин GL_TRIANGLE_STRIP / GL_TRIANGLE_FAN . Фактически в обеих методах первые 2е вершины берутся из предыдущего треугольника. Стрип дает ленту, фан дает звезду. А вырожденные значит 3 точки на одной линии. Magistrus, вырожденные треугольники как-то неправильно отображаются? Может им просто нужно задать правильные нормали? |
| Автор: Bitter 26.8.2013, 15:10 |
Ок как могут вообще правильно отображаться вырожденные треугольники? Если три точки на одной прямой то это по-моему явно какой-то косяк геометрии. И какая может быть нормаль к отрезку? |
| Автор: Alexeis 26.8.2013, 17:06 |
Можно посчитать нормаль как среднее арифметическое 2х нормалей соседних невырожденных треугольников. |
| Автор: Bitter 26.8.2013, 21:09 |
| А если вырожденных два или больше подряд? |
| Автор: Magistrus 27.8.2013, 12:11 | ||||
Они отображаются правильно - в виде линии, но хотелось бы чтобы они не отображались вовсе. Добавлено @ 12:14
вырожденные треугольники нужны для соеденения нескольких стрипов в один, когда геометрии нельзя соеденить треугольником. Правильное отображение вырожденного треугольника это линия, соеденяющая стрипы. |
| Автор: Bitter 27.8.2013, 12:28 |
| Magistrus, а можно скриншот? Интересно как это выглядит |
| Автор: Magistrus 27.8.2013, 13:33 |
| Magistrus, а можно скриншот? Интересно как это выглядит glDisable(GL_CULL_FACE) ![]() glEnabel(GL_CULL_FACE) ![]() |
| Автор: Alexeis 27.8.2013, 13:47 |
| Ну гугл выдает решение с glEnable(GL_PRIMITIVE_RESTART) http://www.opengl.org/wiki/Vertex_Rendering#Primitive_Restart Т.е. не использовать вообще вырожденные треугольники. |
| Автор: Bitter 27.8.2013, 13:56 |
| Ну в данном случае похоже что геометрия построена не правильно, даже используя стрип, можно построить этот прямоугольник без таких швов. Ну и в конце концов можно использовать обычный способ отрисовки треугольников, тогда таких косяков не будет. Еще вариант, не знаю поможет ли, попробовать рисовать переднюю и заднюю часть отдельно с включенным отсечением. То есть сначала рисуем треугольниси CW потом CCW. Ну или наоборот |
| Автор: Alexeis 27.8.2013, 14:40 |
| Magistrus, так не просто удалять, а перезапускать стрип при помощи glEnable(GL_PRIMITIVE_RESTART) . Я сам не пробовал, но в вики пишут, что В OpenGL 3.1 как раз ввели этот механизм для устранения "дегнератов". |
| Автор: Magistrus 27.8.2013, 17:05 | ||
Не помогает :( ![]() да и мне нужна поддержка OpenGl 2.0 и выше |
| Автор: Bitter 27.8.2013, 17:32 | ||
Так это не дополнительная геометрия, она остается той же самой, просто рендер этой геометрии делайте два раза, первый раз с включенным отображением GL_CW, а второй раз с GL_CCW. Если я не ошибаюсь это делает функция glFrontFace |
| Автор: Magistrus 27.8.2013, 17:50 | ||
но в итоге на сцене будет две геометрии, с разными сторонами обхода, а этого делать нельзя, так как количество геометрий очень велико и падает производительность. |