PBR próximos seis aprendizaje --URP URP

LitShader sección anterior hemos aprendido lo que funciona más o menos, dejando a las preguntas relacionadas con PBR-, para responder a esta sección nos fijamos en el PBR URP exactamente lo que se ha hecho de optimizar.

Para saber qué hacer optimización, debe saber que el PBR es lo que parece.

Estándar unidad original se escribe así:

half4 BRDF1_Unity_PBS (half3 diffColor, half3 specColor, medio oneMinusReflectivity, medio suavidad, 
    float3 normal, float3 viewDir, 
    luz UnityLight, UnityIndirect gi) 
{ 
    float perceptualRoughness = SmoothnessToPerceptualRoughness (suavidad); 
    float3 halfDir = Unity_SafeNormalize (float3 (light.dir) + viewDir);

#define UNITY_HANDLE_CORRECTLY_NEGATIVE_NDOTV 0 #if UNITY_HANDLE_CORRECTLY_NEGATIVE_NDOTV
     // La cantidad cambiamos de la normal hacia el vector vista se define por el producto de punto. 
    medio shiftAmount = punto (normal, viewDir); 
    normales = shiftAmount < 0.0f

? normal + viewDir * (-shiftAmount + 1e-5f ): normal;
    // Una re-normalización debe aplicarse aquí, pero como el cambio es pequeño que no lo hacen para salvar ALU.
    // = Normal Normalizar (normal); 

    medio nv = saturado (punto (normal, viewDir)); // TODO: este saturado no debería ser necesario aquí 
#else 
    medio nv = abs (punto (normal, viewDir));    // Este abs permiten limitar artefacto 
#endif 

    medio nl = saturado (punto (normal, light.dir));
    flotar nh = saturado (punto (normal, halfDir)); 

    medio lv =saturado (punto (light.dir, viewDir)); 
    medio lh = saturado (punto (light.dir, halfDir)); 

    // difusa término 
    medio diffuseTerm = DisneyDiffuse (nv, nl, LH, perceptualRoughness) * nl; 

    // especular término
     // Hack: teóricamente deberíamos dividir diffuseTerm de Pi y no specularTerm multiplican!
    // PERO 1) que hará mirada shader significativamente más oscuro que los heredados
     // y 2) en el lado del motor "no importante" luces tienen que ser dividido por Pi también en los casos en que se inyectan en ambiente SH 
    flotador rugosidad = PerceptualRoughnessToRoughness ( perceptualRoughness);
#if UNITY_BRDF_GGX
    // GGX con roughtness a 0 significaría sin especular en absoluto, utilizando max (rugosidad, 0.002) para que coincida con HDrenderloop roughtness reasignación. 
    rugosidad = max (rugosidad, 0.002 ); 
    medio V = SmithJointGGXVisibilityTerm (nl, nv, rugosidad);
    flotar D = GGXTerm (nh, rugosidad);
#else 
    // Legado 
    medio V = SmithBeckmannVisibilityTerm (nl, nv, rugosidad); 
    medio D = NDFBlinnPhongNormalizedTerm (nh, PerceptualRoughnessToSpecPower (perceptualRoughness));
#endif 

    medio specularTerm = V * D * UNITY_PI; //Modelo Torrance-Sparrow, Fresnel se aplica más tarde 

#ifdef UNITY_COLORSPACE_GAMMA 
        specularTerm = sqrt (max (1E- 4H, specularTerm)); 
#Endif 

    // specularTerm * nl puede ser NaN en Metal en algunos casos, el uso máximo () para asegurarse de que es un valor cuerdo 
    specularTerm = max ( 0 , specularTerm * nl);
#if definido (_SPECULARHIGHLIGHTS_OFF) 
    specularTerm = 0,0 ;
#endif 

    // surfaceReduction = Int D (NdotH) * NdotH * Id (NdotL> 0) dH = 1 / (rugosidad ^ 2 + 1) 
    medio surfaceReduction; 
#Ifdef UNITY_COLORSPACE_GAMMA 
        surfaceReduction =1.0 - 0,28 * * rugosidad perceptualRoughness;      // 1-0,28 * x ^ 3 como aproximación para (1 / (x ^ 4 + 1)) ^ (1 / 2,2) en el dominio [0; 1] 
#    otro 
        surfaceReduction = 1,0 / (rugosidad * rugosidad + 1,0 ) ;           // fade \ in [0,5; 1] 
#endif 

    // Para proporcionar verdadera iluminación Lambert, necesitamos ser capaces de matar a especular completamente. 
    specularTerm * = ninguna (specColor)? 1,0 : 0,0 ; 

    medio grazingTerm = saturado (suavidad + ( 1 - oneMinusReflectivity)); 
    el color half3= DiffColor * (gi.diffuse + light.Color * diffuseTerm)
                     + specularTerm * light.Color * FresnelTerm (specColor, LH)
                     + surfaceReduction * gi.specular * FresnelLerp (specColor, grazingTerm, NV); 

    volver half4 (color, 1 ); 
}

Buscamos calcular directamente el color final de:

* Color = difusa de color (color de la luz del GI * + difusa artículo difusa) + alta elemento reflectancia de la luz * * color de la superficie luz del parámetro de reflexión Fresnel término + reducción GI * * Specular Fresnel interpolación

En el que el artículo es una reflexión difusa DisneyDiffuse, alta reflectancia de la luz y los siguientes artículos por el término Fresnel D (NDF) V (del visiblity) se compone de una BRDF núcleo, alta de luz ambiente por el GI parámetros de color de alta reflectancia de la luz, y para reducir la superficie de reflexión de Fresnel interpolación (la specularColor como F0, grazingTerm como F90) decisión conjunta.

 Dos de lectura de códigos autor hizo una comparación que la luz ambiental calculada es sustancialmente ningún cambio URP anteriormente, la clave está en hacer grandes cambios BRDF.

En primer lugar, la reflexión difusa de la línea original con es Disney, el URP será resultante DirectBRDF difusa y reflexión especular de todo multiplicado por un brillo, luminosidad unidades representativas de radiación fragmento, el cálculo específico es la luz, la atenuación de la luz y ndotl (clave), NdotL por el artículo es una reflexión difusa BRDF Lambert (por supuesto, esto es para facilidad de comprensión, de hecho entiende mejor de acuerdo con la cantidad de radiación).

A continuación, se calcula resaltar elementos BRDF hechas optimización URP. BRDF tres más importante factor D, V, F (V G es el término término unidad y denominador fueron combinados), V y F se hacen en la optimización URP, el producto de la URP VF integrado en un simplificado fórmula para lograr los resultados óptimos, podemos comparar la fórmula:

Built-in Pipeline Visibilidad:

 

 de URP VF:

 

 Se puede observar en V para URP hacer una gran optimización, en cuanto a lo que esta optimización se basa, gobierno de la Unidad también ha dado a punto: consulte "Optimización de PBR para móviles" de Siggraph 2015 en movimiento gráficos móviles supuesto

Debe ser Siggraph 2015 artículo, el artículo es un archivo de gran tamaño poco, poner el enlace aquí: http: //s2015.siggraph.org/sites/default/files/firstpages.reduced.pdf

Interesado socio menor puede ir a ver. Esto debería haber estado sintiendo una gran cantidad de contenido de escritura, más tarde se encontró ha publicado el código afectará a la percepción Después de leerlo, por lo que salir de su propio resumen o directamente sobre el bien aquí (aunque no muchos Resumen ~), este artículo únicamente se trata de después de URP Litshader proceso de expansión temporal cabo, cuando se hace un registro de ello, la siguiente sección, ¿qué podemos aprender, pensar por mucho tiempo y se encontró que debería concentrarse en el tema, por lo que la siguiente sección nos fijamos en la forma de extender y RenderFeature URP URP ( Como LitShader otra parte, decidió pasar hay necesidad de decir, por un lado, el tiempo no es muy abundante, entonces deben trabajar juntos para aprender :) en otras series).

Si usted tiene socios pequeños o comentarios, puedes dejar un comentario debajo del artículo oh ~

Supongo que te gusta

Origin www.cnblogs.com/shenyibo/p/12550937.html
Recomendado
Clasificación