Операция размытия в фрагментном шейдере со значениями с плавающей точкой

Я пытаюсь выполнить операцию размытия в фрагментном шейдере, прикрепив текстуру (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 проблемы:

  1. нормализовать сsum/40

    вместо постоянного 40 Вы должны разделить на количество дополнений, которое является ~(2*10*depth)^2 в первом коде. Второй код неверен...

  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

Другие вопросы по тегам