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

Проблемы с gl_FragDepth (решено)

Страницы: 1 2 3 Следующая »
#0
9:37, 27 сен 2018

Возникла тут непонятная проблема: если писать в gl_FragDepth в шейдере - на выходе получаю строго 0, не зависимо от того, что пишу. Из-за чего может быть такая фигня?
Шейдер элементарный

#version 130
in vec4 fragmentColor;
in vec4 gl_FragCoord;
out float gl_FragDepth;

void main( void )
{
gl_FragColor = fragmentColor;
gl_FragDepth = 1.;  //gl_FragCoord.z;
}
#1
10:23, 27 сен 2018

Grobozavr
> #version 130
а оно вообще компилится?

#2
10:36, 27 сен 2018

/A\
А почему нет? Хотя тут оно вообще странно работает. Вроде как пишет, что макс версия 1.20, но с 1.3 работает. Вот выше уже не компилится.

#3
10:38, 27 сен 2018

это вообше законно?

#4
10:48, 27 сен 2018

А хз. На других машинах тоже работает.

#5
11:11, 27 сен 2018

Grobozavr
> хз. На других машинах тоже работает
А место, куда пишется "gl_FragDepth" создано? Связано?

#6
11:34, 27 сен 2018

PA3UJIb
В смысле? А оно разве не пишет в обычный буфер глубины? О_О
Да и писал выше - проблема не в том, что не пишется, а в том, что пишется хрень.

#7
12:14, 27 сен 2018

Просто "0" обычно означает, что отсутствие чего-либо. Плюс я привык, что gl_FragCoord, gl_FragDepth переменные встроенные и как-то принудительно их объявлять не надо.

#8
12:42, 27 сен 2018

PA3UJIb
> что отсутствие чего-либо. Плюс я привык, что gl_FragCoord, gl_FragDepth
> переменные встроенные и как-то

В буфере глубины 0 - это не отсутствие чего-то, а наличие чего-то слишком близко. Там, где ничего нет пишется 1. Ну она и пишется. Если убрать запись в глубину - то в отладке картинка вполне адекватная: ближе - темнее, дальше - светлее. Если добавить, то весь рендер - 0, фон - 1.

Если честно - я не знаю, как правильно. Пробовал и так и сяк. С объявлениями вообще не разобрался. Как система понимает, что вот этот вектор - цвет, а этот координаты если они оба vec4? И как на выходе разбирается, где что... Короче - пытаюсь шаманить, но не растёт кокос :(

#9
13:06, 27 сен 2018

А перед отрисовкой-то буфер глубины чистится?
В смысле есть перед командами glDraw* glCLear ( GL_COLORBUFFER_BIT | GL_DEPTH_BUFFER_BIT );?
И какой вид функции depth_test стоит?

Из спецификации GLSLangSpec.1.30.pdf:

Writing to gl_FragDepth will establish the depth value for the fragment being processed. If depth
buffering is enabled, and no shader writes gl_FragDepth, then the fixed function value for depth will be
used as the fragment’s depth value. If a shader statically assigns a value to gl_FragDepth, and there is an
execution path through the shader that does not set gl_FragDepth, then the value of the fragment’s depth
may be undefined for executions of the shader that take that path. That is, if the set of linked fragment
shaders statically contain a write to gl_FragDepth, then it is responsible for always writing it.

#10
13:19, 27 сен 2018

PA3UJIb
Ну если фон правильно - чистится. Да и как очистка фона может повлиять на то, что рендерится ПОВЕРХ него? Ещё раз говорю - если убрать запись в глубину - картинка правильная.
Тест по умолчанию. Про запись читал. У меня, вроде, там нет путей, где он не пишется :)

Есть вариант, что это косяк в дровах, но хз как это проверить.

#11
13:38, 27 сен 2018

Grobozavr
> писать в gl_FragDepth
Насколько я знаю, писать в gl_FragDepth - плохая практика и лучше этого избегать. Что за задача? Может, ее следует решить по-другому?

#12
13:40, 27 сен 2018

/A\
> > #version 130
> а оно вообще компилится?
PA3UJIb
> gl_FragCoord, gl_FragDepth переменные встроенные и как-то принудительно их объявлять не надо.
вот именно для GLSL 1.x встроенные, GLSL 3.x core/GLSL 3.x ES и выше они не нужны, в случае автора они объявлены повторно, очень странно что компилится

#13
14:00, 27 сен 2018

Роман Шувалов
Избегать не получится, поскольку SDF. У меня вся глубина - результат работы фрагмента.

Andrey
Если убрать - ничего не меняется. Ни в хорошую, ни в плохую сторону.

#14
15:01, 27 сен 2018

Grobozavr
> У меня вся глубина - результат работы фрагмента.
А нельзя задействовать MRT и писать результат во вторую текстуру?

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.