Войти
ПрограммированиеФорумГрафика

Отсутствие артефактов

#0
(Правка: 22:55) 22:54, 24 мар. 2020

Имеется простейшая программа на c++, отрисовывающая текстурированные кубы. Используя при этом opengl (с сопутствующими библиотеками).
На выходе получается 2 слоя по 12 кубов  (каждый слой со своей текстурой). Слои рисуются в 2 последовательных вызова отрисовки (glDrawArrays...), затем glfwSwapBuffers и повторяется.
Вопрос:
  Почему на выходном кадре нет артефактов от наложения отрисовок друг на друга?
А также от чего на гранях появляются белые проблески?


#1
(Правка: 23:17) 23:11, 24 мар. 2020

hlpis
> Почему на выходном кадре нет артефактов от наложения отрисовок друг на друга?
Если кубы рисуются в одном и том же месте с одинаковой матрицей поворота, то они просто совпадают. И все будет зависеть от того какая операция DepthTest используется. Но артифактов по любому не должно быть.
hlpis
> А также от чего на гранях появляются белые проблески?
Видимо используется АА сглаживание, но это не точно. Края не полностью отрабатываются по DepthTest или закрашивают предыдущий пиксель, они частично смешиваются с тем что было нарисовано. От этого может происходить что то на подобии эффекта Blend Add.

#2
23:18, 24 мар. 2020

foxes
> И все будет зависеть от того какая операция DepthTest используется.
Спасибо, я это и хотел выяснить.
foxes
> Видимо используется АА сглаживание, но это не точно.
Да, так оно и есть (MSAA). Но всё-же как от этого избавиться?

#3
(Правка: 23:36) 23:21, 24 мар. 2020

hlpis
> Но всё-же как от этого избавиться?
Возможно что именно с MSAA никак, просто использовать другой фильтр антиалиасинга. Но MSAA
это пост эффект, поэтому есть подозрение что не отключен в видеокарте именно стандартный AA. То есть стоит по умолчанию. Это все догадки, нужно проводить реальные тесты, что то включать, а что то отключать.
Также может получиться что у тебя на текстурах края с альфа каналом, а мне отсюда не видно. Поэтому без реализации тут можно только перечислять возможности, которые приходят в голову.

#4
23:38, 24 мар. 2020

foxes
> То есть стоит по умолчанию.
Спасибо! Я убрал строчку с подключением MSAA и это помогло, но вдалеке появилась лесенка)

#5
23:42, 24 мар. 2020

hlpis
> но вдалеке появилась лесенка)
А дверь там не появилась? Неплохо было бы картинку увидеть.

#6
0:00, 25 мар. 2020

С MSAA:
Изображение

Без MSAA:
Изображение

Далеко
С MSAA:
Изображение

Без MSAA:
Изображение

#7
(Правка: 0:35) 0:17, 25 мар. 2020

hlpis
> С MSAA:
hlpis
> Далеко
> С MSAA:
А в чем разница?
Больше похоже на то что у тебя текстура не клампится или нет бордюров. Можно заменить что глюк происходит снизу справа от пикселя, скорее всего это баг реализации MSAA. Или это вовсе не MSAA.
Если один кубик отрисовывать такая же шляпа?

#8
(Правка: 1:28) 1:26, 25 мар. 2020

hlpis
покажи, как ты "отключаешь msaa", потому что дело наверняка не в нём. ты случайно не какой-нибудь glEnable(GL_LINE_SMOOTH) называешь msaa?

#9
4:54, 25 мар. 2020

hlpis
Модификатор centroid не помогает?
https://www.opengl.org/pipeline/article/vol003_6/

#10
20:14, 25 мар. 2020

hlpis

gl_texture_wrap_[s,t] установи gl_repeat

#11
(Правка: 21:03) 21:03, 25 мар. 2020

0xc0de
> gl_texture_wrap_[s,t] установи gl_repeat
Даже если у него оно не установлено в gl_repeat, то установка не поможет полностью. У него не все текстуры тайлятся во все 4 стороны. Например текстура с травой сбоку не затайлится по вертикали. Тут скорее gl_clamp_to_edge нужен (опять же если у него не атлас). Ну либо centroid.

#12
22:13, 25 мар. 2020

Может быть лучше GL_MIRRORED_REPEAT

#13
22:31, 25 мар. 2020

MrShoor
> У него не все текстуры тайлятся во все 4 стороны. Например текстура с травой
> сбоку не затайлится по вертикали

Тогда cubemap спасет или texture array c бордерами соседних тайлов

ПрограммированиеФорумГрафика