Как исправить ошибки с плавающей запятой в OpenGL PBR
Закончив реализацию PBR, я заметил, что когда я подхожу к отражающей поверхности, появляются артефакты, которые, я думаю, являются ошибками с плавающей запятой. Я действительно хотел бы не использовать удвоения, поскольку мой графический процессор имеет тенденцию обрабатывать удвоения с высокой производительностью
Вот мой код IBR PBR (все карты окружения верны, а также отложенные буферы):
// Deferred rendering
vec2 texcoord = gl_FragCoord.xy / textureSize(R_GBP, 0);
vec3 P = texture2D(R_GBP, texcoord).xyz;
vec4 A = texture2D(R_GBA, texcoord).rgba;
vec3 N = texture2D(R_GBN, texcoord).xyz;
float M = texture2D(R_GBM, texcoord).r;
float R = texture2D(R_GBR, texcoord).r;
vec3 V = normalize(R_CameraPos - P);
vec3 T = reflect(-V, N);
vec3 F0 = mix(vec3(0.04), A.rgb, M);
float NDV = max(dot(N, V), 0);
vec3 kS = FresnelSchlickRoughness(NDV, F0, R);
vec3 kD = (1 - kS) * (1 - M);
vec3 irr = textureCube(R_EnvironmentIrradiance, N).rgb;
vec3 dfs = irr * A.rgb;
const float MaxReflectionLod = 4;
vec3 preF_col = textureLod(R_EnvironmentPreFilter, T, R * MaxReflectionLod).rgb;
vec2 brdf = texture2D(R_EnvironmentBRDF, vec2(NDV, R)).rg;
vec3 specular = preF_col * (kS * brdf.x + brdf.y);
vec3 ambient = kD * dfs + specular;