Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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,  14:17 Найти цитируемый пост)
вырожденные треугольники как-то неправильно отображаются?

Ок как могут вообще правильно отображаться вырожденные треугольники? Если три точки на одной прямой то это по-моему явно какой-то косяк геометрии. И какая может быть нормаль к отрезку?

Автор: Alexeis 26.8.2013, 17:06
Цитата(Bitter @  26.8.2013,  16:10 Найти цитируемый пост)
 И какая может быть нормаль к отрезку? 

  Можно посчитать нормаль как среднее арифметическое 2х нормалей соседних невырожденных треугольников.

Автор: Bitter 26.8.2013, 21:09
А если вырожденных два или больше подряд? smile

Автор: Magistrus 27.8.2013, 12:11
Цитата(Alexeis @ 26.8.2013,  14:17)

Magistrus, вырожденные треугольники как-то неправильно отображаются? Может им просто нужно задать правильные нормали?


Они отображаются правильно - в виде линии, но хотелось бы чтобы они не отображались вовсе.

Добавлено @ 12:14
Цитата(Bitter @ 26.8.2013,  15:10)
Цитата(Alexeis @  26.8.2013,  14:17 Найти цитируемый пост)
вырожденные треугольники как-то неправильно отображаются?

Ок как могут вообще правильно отображаться вырожденные треугольники? Если три точки на одной прямой то это по-моему явно какой-то косяк геометрии. И какая может быть нормаль к отрезку?


вырожденные треугольники нужны для соеденения нескольких стрипов в один, когда геометрии нельзя соеденить треугольником. 

Правильное отображение вырожденного треугольника это линия, соеденяющая стрипы. 

Автор: Bitter 27.8.2013, 12:28
Magistrus, а можно скриншот? Интересно как это выглядит

Автор: Magistrus 27.8.2013, 13:33
Magistrus, а можно скриншот? Интересно как это выглядит

glDisable(GL_CULL_FACE)
user posted image
glEnabel(GL_CULL_FACE)
user posted image

Автор: 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. Ну или наоборот

Автор: Magistrus 27.8.2013, 14:09
Цитата(Bitter @  27.8.2013,  13:56 Найти цитируемый пост)
Ну в данном случае похоже что геометрия построена не правильно, даже используя стрип, можно построить этот прямоугольник без таких швов. Ну и в конце концов можно использовать обычный способ отрисовки треугольников, тогда таких косяков не будет.


Геометрия поступает из внешнего источника и я ее отображаю как есть. Т.е. изменять геометрию нельзя.

Цитата(Bitter @  27.8.2013,  13:56 Найти цитируемый пост)
Еще вариант, не знаю поможет ли, попробовать рисовать переднюю и заднюю часть отдельно с включенным отсечением. То есть сначала рисуем треугольниси CW потом CCW. Ну или наоборот 


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

Добавлено через 6 минут и 33 секунды
Цитата(Alexeis @  27.8.2013,  13:47 Найти цитируемый пост)
Т.е. не использовать вообще вырожденные треугольники.  


К сожелению это не поможет, так как вырожденные треугольники есть в исходных данных и удаление их из индексов, приводит к неправильному отображению сцены.

Автор: Alexeis 27.8.2013, 14:40
Magistrus, так не просто удалять, а перезапускать стрип при помощи glEnable(GL_PRIMITIVE_RESTART)​ . Я сам не пробовал, но в вики пишут, что В OpenGL 3.1 как раз ввели этот механизм для устранения "дегнератов".

Автор: Magistrus 27.8.2013, 17:05
Цитата(Alexeis @  27.8.2013,  14:40 Найти цитируемый пост)
Magistrus, так не просто удалять, а перезапускать стрип при помощи glEnable(GL_PRIMITIVE_RESTART)​ . Я сам не пробовал, но в вики пишут, что В OpenGL 3.1 как раз ввели этот механизм для устранения "дегнератов". 


Не помогает :(

user posted image

да и мне нужна поддержка OpenGl 2.0  и выше

Автор: Bitter 27.8.2013, 17:32
Цитата(Magistrus @  27.8.2013,  14:09 Найти цитируемый пост)
Я упоминал в начале темы, что добаление дополнительной геометрий не возможно, опять же из-за политики отображать все как есть.

Так это не дополнительная геометрия, она остается той же самой, просто рендер этой геометрии делайте два раза, первый раз с включенным отображением GL_CW, а второй раз с GL_CCW. Если я не ошибаюсь это делает функция glFrontFace

Автор: Magistrus 27.8.2013, 17:50
Цитата(Bitter @  27.8.2013,  17:32 Найти цитируемый пост)
Так это не дополнительная геометрия, она остается той же самой, просто рендер этой геометрии делайте два раза, первый раз с включенным отображением GL_CW, а второй раз с CGL_CW. Если я не ошибаюсь это делает функция glFrontFace 


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)