国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

unity urp 實(shí)現(xiàn)絲綢渲染

這篇具有很好參考價(jià)值的文章主要介紹了unity urp 實(shí)現(xiàn)絲綢渲染。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

首先看一下實(shí)際上真實(shí)的效果
unity urp 實(shí)現(xiàn)絲綢渲染
再來一張
unity urp 實(shí)現(xiàn)絲綢渲染
這是專門去找的。
可以看到絲綢渲染使用了各向異性的GGX去實(shí)現(xiàn),有點(diǎn)仿頭發(fā)的感覺,接下來看一下怎么實(shí)現(xiàn)的。

首先,準(zhǔn)備實(shí)現(xiàn)雙向反射率分布函數(shù)(BRDF)的DVF項(xiàng)。
D項(xiàng)使用UE里面的各項(xiàng)異性GGX:

// [Burley 2012, "Physically-Based Shading at Disney"]
float D_GGXaniso(float ax, float ay, float NoH, float XoH, float YoH)
{
	float a2 = ax * ay;
	float3 V = float3(ay * XoH, ax * YoH, a2 * NoH);
	float S = dot(V, V);

	return(1.0f / PI) * a2 * Square(a2 / S);
}

V項(xiàng)使用配合D項(xiàng)的Vis_SmithJointAniso

// [Heitz 2014, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs"]
float Vis_SmithJointAniso(float ax, float ay, float NoV, float NoL, float XoV, float XoL, float YoV, float YoL)
{
	float Vis_SmithV = NoL * length(float3(ax * XoV, ay * YoV, NoV));
	float Vis_SmithL = NoV * length(float3(ax * XoL, ay * YoL, NoL));
	return 0.5 * rcp(Vis_SmithV + Vis_SmithL);
}
這個(gè)函數(shù)里面的x就是tangent y就是bitangent 中間的o就是dot計(jì)算結(jié)果

F項(xiàng)使用UE里面的F項(xiàng):

// [Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering"]
float3 F_Schlick_UE4(float3 SpecularColor, float VoH)
{
	float Fc = Pow5(1 - VoH);					// 1 sub, 3 mul
	//return Fc + (1 - Fc) * SpecularColor;		// 1 add, 3 mad
	
	// Anything less than 2% is physically impossible and is instead considered to be shadowing
	return saturate(50.0 * SpecularColor.g) * Fc + (1 - Fc) * SpecularColor;
}

使用DVF項(xiàng)實(shí)現(xiàn)雙向反射率分布函數(shù):

float3 SlikBRDF(float3 DiffuseColor, float3 SpecularColor, float Roughness, float Anisotropy,
float3 N, float3 T, float3 B, float3 V, float3 L, float3 LightColor, float Shadow)
{
	float Alpha = Roughness * Roughness;
	float a2 = Alpha * Alpha;
	// Anisotropic parameters: ax and ay are the Roughness along the tangent and bitangent
	// Kulla 2017, "Revisiting Physically Based Shading at Imageworks"
	float ax = max(Alpha * (1.0 + Anisotropy), 0.001f);
	float ay = max(Alpha * (1.0 - Anisotropy), 0.001f);
	float3 H = normalize(L + V);
	float NoH = saturate(dot(N, H));
	float NoV = saturate(abs(dot(N, V)) + 1e-5);
	float NoL = saturate(dot(N, L));
	float VoH = saturate(dot(V, H));

	float XoV = dot(T, V);
	float XoL = dot(T, L);
	float XoH = dot(T, H);
	float YoV = dot(B, V);
	float YoL = dot(B, L);
	float YoH = dot(B, H);

	float3 Radiance = NoL * LightColor * Shadow * PI;
	
	//直接光漫反射
	float3 DiffuseTerm = Diffuse_Lambert(DiffuseColor) * Radiance;

	//直接光鏡面反射
	float D = D_GGXaniso(ax, ay, NoH, XoH, YoH);
	float Vis = Vis_SmithJointAniso(ax, ay, NoV, NoL, XoV, XoL, YoV, YoL);
	float3 F = F_Schlick_UE4(SpecularColor, VoH);
	float3 SpecularTerm = ((D * Vis) * F) * Radiance;

	return DiffuseTerm + SpecularTerm;
}

其它代碼,我們可以直接魔改unity的urp內(nèi)置的lit函數(shù),用于獲取相關(guān)的參數(shù),這里就不再聊了。
那么,你會(huì)發(fā)現(xiàn)一個(gè)問題,因?yàn)镚GXaniso 主要使用的是tangent和bitangent的朝向做高光的,我們平時(shí)做高光的時(shí)候都是使用法向的, 法向貼圖不會(huì)影響這兩個(gè)朝向啊,那么怎么辦,這么辦:

    //設(shè)置T和B也受法線貼圖的影響
    half3 tangentTS = normalize(surfaceData.normalTS.x * half3(0, 0, 1) * _NormalAniso + half3(1, 0, 0));
    half3 T = TransformTangentToWorld(tangentTS, tangentToWorld);
    T = NormalizeNormalPerPixel(T);

    half3 bitangentTS = normalize(surfaceData.normalTS.y * half3(0, 0, 1) * _NormalAniso + half3(0, 1, 0));
    half3 B = TransformTangentToWorld(bitangentTS, tangentToWorld);
    B = NormalizeNormalPerPixel(B);

我們用法向的x軸的量去影響切線空間下的切線的向量值,然后再將其轉(zhuǎn)換到世界空間即可。
直接光的函數(shù)運(yùn)算如下:

float3 DirectLighting(float3 DiffuseColor, float3 SpecularColor, float Roughness, float3 WorldPos, float Anisotropy, 
	float3 N, float3 T, float3 B, float3 V, float4 shadowCoord, float4 shadowMask)
{
	//主光源
	half3 DirectLighting_MainLight = half3(0, 0, 0);
	{
		Light light = GetMainLight(shadowCoord, WorldPos, shadowMask);
		half3 L = light.direction;
		half3 LightColor = light.color;
		half Shadow = light.shadowAttenuation;
		DirectLighting_MainLight = SlikBRDF(DiffuseColor, SpecularColor, Roughness, Anisotropy, N, T, B, V, L, LightColor, Shadow);
	}
	//附加光源
	half3 DirectLighting_AddLight = half3(0, 0, 0);
	#ifdef _ADDITIONAL_LIGHTS
		uint pixelLightCount = GetAdditionalLightsCount();
		for (uint lightIndex = 0; lightIndex < pixelLightCount; ++lightIndex)
		{
			Light light = GetAdditionalLight(lightIndex, WorldPos, shadowMask);
			half3 L = light.direction;
			half3 LightColor = light.color;
			half Shadow = light.shadowAttenuation * light.distanceAttenuation;
			DirectLighting_AddLight += SlikBRDF(DiffuseColor, SpecularColor, Roughness, Anisotropy, N, T, B, V, L, LightColor, Shadow);
		}
	#endif

	return DirectLighting_MainLight + DirectLighting_AddLight;
}

計(jì)算主光源和附加光源,即可實(shí)現(xiàn)直接光的漫反射和鏡面反射。
unity urp 實(shí)現(xiàn)絲綢渲染
這是-0.9的Anisotropy的效果
unity urp 實(shí)現(xiàn)絲綢渲染
這是Anisotropy的值為0.9的效果,當(dāng)前的雙向反射率分布函數(shù),如果把Anisotropy設(shè)置為1或者-1,效果上表現(xiàn)會(huì)很差。

環(huán)境光

首先,如果在環(huán)境光鏡面反射上面實(shí)現(xiàn)aniso的效果呢,這里有段代碼:

	//根據(jù)設(shè)置的各項(xiàng)異性的強(qiáng)度,對(duì)法向進(jìn)行扭曲,實(shí)現(xiàn)各項(xiàng)異性的環(huán)境高光
	float3 anisotropicDirection = Anisotropy >= 0.0 ? B : T;
	float3 anisotropicTangent = cross(anisotropicDirection, V);
	float3 anisotropicNormal = cross(anisotropicTangent, anisotropicDirection);
	float3 bentNormal = normalize(lerp(N, anisotropicNormal, abs(Anisotropy)));

用這個(gè)最終生成的bentNormal去替換之前的計(jì)算反射角度的N,就可以實(shí)現(xiàn)環(huán)境光鏡面反射,效果是這樣的:
unity urp 實(shí)現(xiàn)絲綢渲染
為了看效果,我故意把光滑度調(diào)高了。
間接光的實(shí)現(xiàn)函數(shù):

float3 IndirectLighting(float3 DiffuseColor, float3 SpecularColor, float Roughness, float3 WorldPos, float Anisotropy, 
float3 N, float3 T, float3 B, float3 V, float Occlusion, float EnvRotation)
{
	float NoV = saturate(abs(dot(N, V)) + 1e-5);
	//SH
	float3 DiffuseAO = AOMultiBounce(DiffuseColor, Occlusion);
	float3 RadianceSH = SampleSH(N);
	float3 IndirectDiffuse = RadianceSH * DiffuseColor * DiffuseAO;
	
	//根據(jù)設(shè)置的各項(xiàng)異性的強(qiáng)度,對(duì)法向進(jìn)行扭曲,實(shí)現(xiàn)各項(xiàng)異性的環(huán)境高光
	float3 anisotropicDirection = Anisotropy >= 0.0 ? B : T;
	float3 anisotropicTangent = cross(anisotropicDirection, V);
	float3 anisotropicNormal = cross(anisotropicTangent, anisotropicDirection);
	float3 bentNormal = normalize(lerp(N, anisotropicNormal, abs(Anisotropy)));

	//IBL
	half3 R = reflect(-V, bentNormal);
	R = RotateDirection(R, EnvRotation);
	half3 SpeucularLD = GlossyEnvironmentReflection(R, WorldPos, Roughness, Occlusion);
	half3 SpecularDFG = EnvBRDFApprox(SpecularColor, Roughness, NoV);
	float SpecularOcclusion = GetSpecularOcclusion(NoV, Pow2(Roughness), Occlusion);
	float3 SpecularAO = AOMultiBounce(SpecularColor, SpecularOcclusion);
	float3 IndirectSpecular = SpeucularLD * SpecularDFG * SpecularAO;

	return IndirectDiffuse + IndirectSpecular;
}

整體的效果:
unity urp 實(shí)現(xiàn)絲綢渲染文章來源地址http://www.zghlxwxcb.cn/news/detail-494918.html

到了這里,關(guān)于unity urp 實(shí)現(xiàn)絲綢渲染的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Unity URP渲染管線與內(nèi)置渲染管線的性能差別

    首先,我們來了解一下Unity的內(nèi)置渲染管線。內(nèi)置渲染管線是Unity較早版本中使用的默認(rèn)渲染管線,它使用的是傳統(tǒng)的圖形渲染技術(shù)。內(nèi)置渲染管線提供了一系列的渲染功能,如陰影、反射、抗鋸齒等。但是,由于其較為龐大且復(fù)雜的設(shè)計(jì),它的性能相對(duì)較低。在高質(zhì)量圖形效

    2024年02月08日
    瀏覽(34)
  • Unity內(nèi)置渲染管線升級(jí)URP教程

    Unity內(nèi)置渲染管線升級(jí)URP教程

    URP全稱為Universal Render Pipeline(通用渲染管線),可以提供更加靈活的渲染方案,通過添加Render Feature實(shí)現(xiàn)各種渲染效果。并且可以針對(duì)移動(dòng)平臺(tái)進(jìn)行專門的優(yōu)化,同時(shí)還提供了SRPBatcher提高渲染效率。Unity的一些工具,比如ShaderGraph,也是必須在URP管線下才可以使用,可以說許多方

    2024年02月16日
    瀏覽(34)
  • Unity——URP & HDRP 渲染模式學(xué)習(xí)筆記

    目錄 HDRP和UPR是兩種完全不同的渲染模式,不能混用,只能選擇其中一種,最好在項(xiàng)目剛開始的時(shí)候就確定好。否則后期所有模型的材質(zhì)都要改變非常麻煩。 修改渲染模式方法: HDRP, URP, BRP區(qū)別 備注 project settins: 1. graphics-Scriptable render pipeline settings 要修改,假如從hdrp改為

    2024年02月04日
    瀏覽(36)
  • [Unity/URP學(xué)習(xí)]風(fēng)格化水體渲染(一)

    [Unity/URP學(xué)習(xí)]風(fēng)格化水體渲染(一)

    著色:水體顏色、水體反射、水體折射、岸邊泡沫、水面于天空沿邊線消除、水體焦散 動(dòng)畫處理:水體流動(dòng)、頂點(diǎn)動(dòng)畫、水體交互、水體浮力 (實(shí)現(xiàn)順序沒有嚴(yán)格按照著色和動(dòng)畫處理的分類來實(shí)現(xiàn)) 要制作水體顏色,要考慮的內(nèi)容如下: 風(fēng)格化的水體漸變顏色、水體深淺區(qū)

    2024年02月13日
    瀏覽(26)
  • 張益唐:數(shù)學(xué)的浪漫 —— 人工智能的很多東西實(shí)際上就是一種最優(yōu)化問題

    張益唐,美國加州大學(xué)圣塔芭芭拉分校數(shù)學(xué)系終身教授。張益唐的研究方向是數(shù)論。2013年4月17日,他在《數(shù)學(xué)年刊》發(fā)表 《質(zhì)數(shù)間的有界間隔》 ,在 孿生素?cái)?shù)猜想 這一數(shù)論重大難題上取得重要突破。2022年,張益唐表示,在本質(zhì)上,他已經(jīng)證明了朗道-西格爾零點(diǎn)猜想,引發(fā)

    2024年02月07日
    瀏覽(29)
  • unity build-in 渲染管線升級(jí)urp渲染 shader篇

    ????????由于工作原因需要對(duì)項(xiàng)目進(jìn)行升級(jí),從build-in渲染管線升級(jí)到urp渲染管線,我自己對(duì)應(yīng)的unity版本是2018.版本升級(jí)到2021.3.2版本,由于最近幾年unity版本升級(jí)比較快,個(gè)體版本差異有所不同,如遇與版本不一致問題敬請諒解。以下是根據(jù)官網(wǎng)等系列網(wǎng)站整理的內(nèi)容

    2023年04月16日
    瀏覽(44)
  • Unity Shader從內(nèi)置渲染管線遷移到URP

    Unity 在URP中將shader更新為了HLSL語言,使用build-in shader 無法直接在URP中使用 這里講一下關(guān)于shader的更新方法 參考 From Built-in to URP Tags 添加 \\\"RenderPipeline\\\" = \\\"UniversalPipeline\\\" CGPROGRAM ENDCG 改變?yōu)?HLSLPROGRAM ENDHLSL #include \\\"UnityCG.cginc\\\" 更改為 #include \\\"Packages/com.unity.render-pipelines.universal/Sh

    2024年02月05日
    瀏覽(30)
  • Unity URP延遲渲染流程簡單分析(Deferred Rendering)

    Unity URP延遲渲染流程簡單分析(Deferred Rendering)

    ??大概兩個(gè)月前的某個(gè)Unity項(xiàng)目里選擇使用了URP延遲渲染管線(其實(shí)沒必要,主要是因?yàn)樽约合胗靡挥谩W(xué)一學(xué),因?yàn)楹罄m(xù)自己的項(xiàng)目中需要使用延遲渲染),但在寫Shader實(shí)現(xiàn)物體表面著色時(shí)卻一直有個(gè)疑惑: ??延遲渲染應(yīng)該是先一個(gè)Pass將信息存儲(chǔ)在GBuffer中,然后再一

    2024年02月07日
    瀏覽(26)
  • vscode顯示當(dāng)前打開的文件夾中沒有g(shù)it存儲(chǔ)庫,但實(shí)際上有.git文件夾。

    vscode顯示當(dāng)前打開的文件夾中沒有g(shù)it存儲(chǔ)庫,但實(shí)際上有.git文件夾。

    問題描述:當(dāng)前打開的文件夾中沒有 git 存儲(chǔ)庫。但實(shí)際上有.git文件夾。 解決方案:https://github.com/microsoft/vscode/issues/139598 The only way to make it work is to use the Git: Show Git Output… command. 在vscode的查看–命令面板,輸入show git,執(zhí)行后即可正確出現(xiàn)git 倉庫。 如果執(zhí)行上述命令后,

    2024年02月11日
    瀏覽(119)
  • Java——它要求用戶輸入一個(gè)整數(shù)(實(shí)際上是一個(gè)字符串),然后計(jì)算該整數(shù)的平方值,并將結(jié)果輸出。

    Java——它要求用戶輸入一個(gè)整數(shù)(實(shí)際上是一個(gè)字符串),然后計(jì)算該整數(shù)的平方值,并將結(jié)果輸出。

    這是一個(gè)Java程序,它要求用戶輸入一個(gè)整數(shù)(實(shí)際上是一個(gè)字符串),然后計(jì)算該整數(shù)的平方值,并將結(jié)果輸出。程序的基本流程如下: 首先,聲明并初始化變量data和result,它們的初始值都為0。 然后,輸出提示信息,要求用戶輸入一個(gè)整數(shù)。 接下來,使用BufferedReader類從

    2024年02月11日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包