Операция размытия в фрагментном шейдере со значениями с плавающей точкой
Я пытаюсь выполнить операцию размытия в фрагментном шейдере, прикрепив текстуру (myTexture) к моему объекту кадрового буфера. Это работает с этим кодом:
vec3 blur(float depth){
float dx = 1.0f/800;
float dy = 1.0f/800;
vec3 sum = vec3(0,0,0);
int dep=depth*10;
for(int i=-dep;i<dep;i++)
for(int j=-dep;j<dep;j++)
sum += texture(myTexture, otex + vec2(i * dx, j * dy)).xyz;
return sum/40;
}
Но если я изменю его на приведенный ниже код, он не будет работать (экран почему-то становится белым, возможно, он читается из глубины текстуры, но я не знаю почему)
vec3 blur(float depth){
float dx = 1.0f/800;
float dy = 1.0f/800;
vec3 sum = vec3(0,0,0);
float dep=depth*10;
for(float i=dep;i<dep;i+=0.2f)
for(float j=dep;j<dep;j+=0.2f)
sum += texture(myTexture, otex + vec2(i * dx, j * dy)).xyz;
return sum/40;
}
Причина, по которой я пытаюсь сделать это, потому что я хочу размыть в соответствии со значением глубины объекта. Если объект далеко, размытие больше. Если это близко, размытие меньше. Если я использую первый код, я получаю ступенчатое размытие, то есть, если глубина составляет 0,3 размытия трижды, если глубина составляет 0,2 размытия дважды....... Я хочу использовать значения с плавающей запятой, чтобы получить плавный переход между значениями размытия вместо ступенчатых значений
Что я делаю неправильно? Кроме того, есть ли другой способ получить плавный переход между значениями размытия.
Благодарю.
1 ответ
У вас есть 2 проблемы:
нормализовать с
sum/40
вместо постоянного
40
Вы должны разделить на количество дополнений, которое является~(2*10*depth)^2
в первом коде. Второй код неверен...неправильный цикл во втором коде
Результирующий
sum
вашего второго куска(0,0,0)
так что это должно быть черным, если вы не делаете что-то поверх этого. Потому что вы получили ошибку в:for(float i=dep;i<dep;i+=0.2f) for(float j=dep;j<dep;j+=0.2f)
это никогда не идет внутрь. Я полагаю, вы хотели это вместо этого:
for(float i=-dep;i<dep;i+=0.2f) for(float j=-dep;j<dep;j+=0.2f)
в таком случае вы должны нормализовать с
~(2*10*5*depth)^2