Как исправить ошибки с плавающей запятой в 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;

0 ответов

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