当前位置: 首页 > wzjs >正文

php手机网站后台源码全方位营销型网站

php手机网站后台源码,全方位营销型网站,wordpress 调用分类名称,公司网站 正式上线我是一名资深游戏开发,小时候喜欢看十万个为什么 要研究的问题 怎么生成G-Buffer,生成了哪些数据 生成G-Buffer DeferredLights类里创建G-Buffer纹理资源句柄,管线setup时创建实际的RT资源 GBufferPass类里填充G-Buffer Config方法里Co…

我是一名资深游戏开发,小时候喜欢看十万个为什么

要研究的问题

怎么生成G-Buffer,生成了哪些数据

生成G-Buffer

DeferredLights类里创建G-Buffer纹理资源句柄,管线setup时创建实际的RT资源

GBufferPass类里填充G-Buffer

  • Config方法里ConfigureTarget
    • 调用CoreUtils绑定RenderTarget,最终调用CommandBuffer的SetRenderTarget把GBuffer对应纹理绑定输出
  • ExecutePass方法中绘制物体
    • context.DrawRenderers(renderingData.cullResults, ref data.drawingSettings, ref data.filteringSettings, s_ShaderTagUniversalMaterialType, false, tagValues, stateBlocks);
  • shader中填充数据,见 UnityGBuffer.hlsl 中 SurfaceDataToGbuffer、 BRDFDataToGbuffer 方法

输出了下面的数据

见文件:UnityGBuffer.hlsl

half4 GBuffer0 : SV_Target0; //diffuse,表面颜色
half4 GBuffer1 : SV_Target1; //metallic/specular,高光
half4 GBuffer2 : SV_Target2; //encode normal,法线
half4 GBuffer3 : SV_Target3; // Camera color attachment,GI,全局光#ifdef GBUFFER_OPTIONAL_SLOT_1
GBUFFER_OPTIONAL_SLOT_1_TYPE GBuffer4 : SV_Target4; //clip z,剪裁空间z值,即深度
#endif

怎么传入多个光源计算光照

逐类型光源

DeferredLights里RenderStencilLights,逐个调用直射光、点光源、射灯进行渲染

using (new ProfilingScope(cmd, m_ProfilingSamplerDeferredStencilPass))
{NativeArray<VisibleLight> visibleLights = renderingData.lightData.visibleLights;if (HasStencilLightsOfType(LightType.Directional))RenderStencilDirectionalLights(cmd, ref renderingData, visibleLights, renderingData.lightData.mainLightIndex);if (HasStencilLightsOfType(LightType.Point))RenderStencilPointLights(cmd, ref renderingData, visibleLights);if (HasStencilLightsOfType(LightType.Spot))RenderStencilSpotLights(cmd, ref renderingData, visibleLights);
}

绘制命令

  • 直射光,遍历光源,逐光源DrawCall
for (int soffset = m_stencilVisLightOffsets[(int)LightType.Directional]; soffset < m_stencilVisLights.Length; ++soffset)省略cmd.SetGlobalVector(ShaderConstants._LightColor, lightColor); // VisibleLight.finalColor already returns color in active color spacecmd.SetGlobalVector(ShaderConstants._LightDirection, lightDir);cmd.SetGlobalInt(ShaderConstants._LightFlags, lightFlags);cmd.SetGlobalInt(ShaderConstants._LightLayerMask, (int)lightLayerMask);// 因为GBufferPass已经把光照数据都输出到纹理,这里只需要绘制全屏的mesh,在shader中采样之前输出的GBuffer计算光照// Lighting pass.cmd.DrawMesh(m_FullscreenMesh, Matrix4x4.identity, m_StencilDeferredMaterial, 0, m_StencilDeferredPasses[(int)StencilDeferredPasses.DirectionalLit]);cmd.DrawMesh(m_FullscreenMesh, Matrix4x4.identity, m_StencilDeferredMaterial, 0, m_StencilDeferredPasses[(int)StencilDeferredPasses.DirectionalSimpleLit]);省略
  • 点光源、射灯也是遍历光源,逐光源DrawCall,但是mesh不是全屏mesh,是代表光源形状的memsh,代码不赘述,今天不水文

渲染

入口StencilDeferred.shader

half4 DeferredShading(Varyings input) : SV_Target//省略部分代码,这些代码是:取GBuffer的值,拼出计算光照需要的数据//计算光照InputData inputData = InputDataFromGbufferAndWorldPosition(gbuffer2, posWS.xyz);#if defined(_LIT)#if SHADER_API_MOBILE || SHADER_API_SWITCH// Specular highlights are still silenced by setting specular to 0.0 during gbuffer pass and GPU timing is still reduced.bool materialSpecularHighlightsOff = false;#elsebool materialSpecularHighlightsOff = (materialFlags & kMaterialFlagSpecularHighlightsOff);#endifBRDFData brdfData = BRDFDataFromGbuffer(gbuffer0, gbuffer1, gbuffer2);color = LightingPhysicallyBased(brdfData, unityLight, inputData.normalWS, inputData.viewDirectionWS, materialSpecularHighlightsOff);#elif defined(_SIMPLELIT)SurfaceData surfaceData = SurfaceDataFromGbuffer(gbuffer0, gbuffer1, gbuffer2, kLightingSimpleLit);half3 attenuatedLightColor = unityLight.color * (unityLight.distanceAttenuation * unityLight.shadowAttenuation);half3 diffuseColor = LightingLambert(attenuatedLightColor, unityLight.direction, inputData.normalWS);half smoothness = exp2(10 * surfaceData.smoothness + 1);half3 specularColor = LightingSpecular(attenuatedLightColor, unityLight.direction, inputData.normalWS, inputData.viewDirectionWS, half4(surfaceData.specular, 1), smoothness);// TODO: if !defined(_SPECGLOSSMAP) && !defined(_SPECULAR_COLOR), force specularColor to 0 in gbuffer codecolor = diffuseColor * surfaceData.albedo + specularColor;#endifreturn half4(color, alpha);

渲染物体

不透明物体

输出G-Buffer,渲染着色

半透物体

延迟渲染不支持半透,所以走Forward渲染,用额外一个 ScriptableRenderPass 渲染半透,见UniversalRenderer 的 m_RenderTransparentForwardPass

贴花

使用方法

  • URP管线资源里创建Renderer,设置使用Deferred
  • 相机里Renderer选上面创建的Renderer

延伸知识

SSAO

  • Screen Space Ambient Occlusion -> 屏幕空间环境光遮蔽
  • SSAO 通过使用深度缓冲、法线缓冲和随机采样核生成遮蔽效果,模拟场景中物体周围环境光被遮挡的情况,从而增强画面的真实感和层次感,让场景看起来更有深度

源码分析

结论

管线流程

  • 生成GBuffer
    • shader中通过SV_TargetXXX指定输出到某个绑定的缓冲区
    • 要求图形接口支持一次输出到多个目标
  • 通过GBuffer渲染

管线

GBufferPass

输出GBuffer

DeferredPass

用GBuffer着色

DrawObjectsPass

绘制物体,不透、半透

RenderGraph

渲染节点图,可以通过编辑器定制渲染管线

DeferredLights

延迟渲染具体的逻辑

shader源码分析

Lit.shader

GBuffer Pass,输出GBuffer数据的Pass

LitGBufferPass.hlsl

输出GBuffer的Pass源码

UnityGBuffer.hlsl

真干活的着色代码

像素着色器输出
struct FragmentOutput
{half4 GBuffer0 : SV_Target0; //diffuse,表面颜色half4 GBuffer1 : SV_Target1; //metallic/specular,高光half4 GBuffer2 : SV_Target2; //encode normal,法线half4 GBuffer3 : SV_Target3; // Camera color attachment,GI,全局光#ifdef GBUFFER_OPTIONAL_SLOT_1GBUFFER_OPTIONAL_SLOT_1_TYPE GBuffer4 : SV_Target4; //clip z,剪裁空间z值,即深度#endif#ifdef GBUFFER_OPTIONAL_SLOT_2half4 GBuffer5 : SV_Target5;#endif#ifdef GBUFFER_OPTIONAL_SLOT_3half4 GBuffer6 : SV_Target6;#endif
};输出GBuffer
FragmentOutput SurfaceDataToGbuffer(SurfaceData surfaceData, InputData inputData, half3 globalIllumination, int lightingMode)
{half3 packedNormalWS = PackNormal(inputData.normalWS);uint materialFlags = 0;// SimpleLit does not use _SPECULARHIGHLIGHTS_OFF to disable specular highlights.#ifdef _RECEIVE_SHADOWS_OFFmaterialFlags |= kMaterialFlagReceiveShadowsOff;#endif#if defined(LIGHTMAP_ON) && defined(_MIXED_LIGHTING_SUBTRACTIVE)materialFlags |= kMaterialFlagSubtractiveMixedLighting;#endifFragmentOutput output;output.GBuffer0 = half4(surfaceData.albedo.rgb, PackMaterialFlags(materialFlags));   // albedo          albedo          albedo          materialFlags   (sRGB rendertarget)output.GBuffer1 = half4(surfaceData.specular.rgb, surfaceData.occlusion);            // specular        specular        specular        occlusionoutput.GBuffer2 = half4(packedNormalWS, surfaceData.smoothness);                     // encoded-normal  encoded-normal  encoded-normal  smoothnessoutput.GBuffer3 = half4(globalIllumination, 1);                                      // GI              GI              GI              unused          (lighting buffer)#if _RENDER_PASS_ENABLEDoutput.GBuffer4 = inputData.positionCS.z;#endif#if OUTPUT_SHADOWMASKoutput.GBUFFER_SHADOWMASK = inputData.shadowMask; // will have unity_ProbesOcclusion value if subtractive lighting is used (baked)#endif#ifdef _WRITE_RENDERING_LAYERSuint renderingLayers = GetMeshRenderingLayer();output.GBUFFER_LIGHT_LAYERS = float4(EncodeMeshRenderingLayer(renderingLayers), 0.0, 0.0, 0.0);#endifreturn output;
}

StencilDeferred.shader

使用GBuffer进行着色

StencilDeferred.hlsl

顶点、像素方法

着色
half4 DeferredShading(Varyings input) : SV_Target...省略代码,不水字数,感兴趣的朋友看URP源码即可

文章转载自:

http://AzHsGPbg.xshkh.cn
http://QtnMPK6K.xshkh.cn
http://LTbgqOBU.xshkh.cn
http://gctTVqj0.xshkh.cn
http://d3xKqzBB.xshkh.cn
http://42twR2Qe.xshkh.cn
http://BEpMGIqr.xshkh.cn
http://2k9HaeCl.xshkh.cn
http://7i5qI2Aw.xshkh.cn
http://gg16INyg.xshkh.cn
http://MAFUqY79.xshkh.cn
http://sRipaicu.xshkh.cn
http://gKXRHRbI.xshkh.cn
http://tKEaDztn.xshkh.cn
http://IX29GCRa.xshkh.cn
http://DGVIJnfq.xshkh.cn
http://KBw3hWcq.xshkh.cn
http://1ONnhiLe.xshkh.cn
http://BYYKukxr.xshkh.cn
http://St4d5vKl.xshkh.cn
http://52mVvQQR.xshkh.cn
http://OREkjPvQ.xshkh.cn
http://QzkLOleB.xshkh.cn
http://18HgBxzp.xshkh.cn
http://nbmeFPxn.xshkh.cn
http://eLllTXgd.xshkh.cn
http://5BwUoxEl.xshkh.cn
http://1IetMGqP.xshkh.cn
http://6bBMjKSr.xshkh.cn
http://cR9WAWcz.xshkh.cn
http://www.dtcms.com/wzjs/679681.html

相关文章:

  • 建站吧惠州网站建设l优选蓝速科技
  • 私人做网站wordpress怎么上传产品
  • 微商城网站建设平台合同多语言商城源码
  • 做哪个外贸网站不用交费泸州市规划建设局网站
  • 网站页尾模板做百度推广首先要做网站吗
  • 整站优化加盟六安的网页制作
  • 温州网站建设有限公司快递业务服务网站建设的需求分析
  • 知乎 php网站开发书籍会ps的如何做网站
  • 赣州网站建设公司哪家好免费发布信息网站有哪些
  • 旅游 便宜 网站建设丽水开发区建设局网站廉租房
  • 交换链接适合哪些网站网站改版设计思路
  • 医院网站建设合同范本做网站用 jsp还是asp
  • 做外贸家纺资料网站设计说明是什么意思
  • 统计网络网站建设的目的网站开发需要多少钱怎样
  • 一站式网站建设电话网站建设与管理心得体会
  • 做网站看什么书wordpress数据库修复
  • 厦门软件园网站开发湖北省建设厅行政审批网站
  • 南沙做网站要多少钱新密市城乡建设局网站
  • 四川省工程项目建设投标发布网站给网站做排名优化学什么好处
  • 江门官网建站公司简历模板免费网站
  • 新闻列表做的最好的网站wordpress改成手机号注册
  • 建设公司网站都需要什么科目wordpress运行php
  • 伍佰亿搜索引擎网站系统中国建设承包商网站
  • 软件综合课设做网站网络科技有限公司的简介
  • 商城网站哪个公司做的好快点号自媒体平台注册
  • 网站开发的可行性报告自己的网站怎么推广
  • 国外推广国内网站能看wordpress
  • 网站开发实例教程青梦建站
  • 为食堂写个网站建设国外创意摄影网站
  • 站长工具网站测速coreldraw