Unity Shader 四 渲染管线

         转眼间一晃已经好长时间了,好像很长的时间都没有更新了哈哈(别扔我鸡蛋。。。。。)。这段时间事情挺多,主要是因为工作的需要转而去研究计算机图形学去了,不得不说计算机图形学果然是博大精深,让我研究的一筹莫展(囧)。

         哈哈,研究了很长时间的填充算法,画线算法,例如DDA,扫描线,种子填充,我这个时候发现快到一个死胡同里面了。以前写Shader只是注意它的效果随便就从网上拉个例子下来并不很理解其中的原理。

         之前在像公司里面的一个大神学习的时候,我发现原来一直没怎么注重的渲染管线原来其实是个很重要的东西,学习Shader的好坏很大程度上面其实要靠对于渲染管线的总体理解,因为Shader毕竟也只是渲染管线中的一环而已。渲染管线主要分为三个阶段:应用程序阶段、几何阶段、光栅阶段。 

         应用程序阶段就比如我们在Unity里开发了一个游戏,其实很多底层的东西Unity都帮我们实现好了,例如碰撞检测、视锥剪裁等等,这个阶段主要是和CPU、内存打交道,在把该计算的都计算完以后,在这个阶段的末端,这些计算好的数据(顶点坐标、法向量、纹理坐标、纹理)就会通过数据总线传给图形硬件,作为我们进一步处理的源数据。 

         几何阶段主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,改阶段基于GPU进行运算,在该阶段的末端得到了经过变换和投影之后的顶点坐标、颜色、以及纹理坐标。简而言之,几何阶段的主要工作就是“变换三维顶点坐标”和“光照计算”。 
         问题随之而来,为什么要变换顶点坐标?我是这么理解的,比如你有一个三维游戏场景,场景中的每个模型都可以用一个向量来确定它的位置,但如何让计算机根据这些坐标把模型正确的、有层次的画在屏幕上?这就是我们需要变换三维顶点坐标的原因,最终目的就是让GPU可以将这些三维数据绘制到二维屏幕上。 

        

          
光栅化阶段,经过上面的步骤之后,我们得到了每个点的屏幕坐标值,和我们需要绘制的图元,但此时还有两个问题: 
(1)屏幕坐标是浮点数,但像素是用整数来表示的,如何确定屏幕坐标值所对应的像素? 
(2)如何根据已确定位置的点,在屏幕上画出线段或者三角形? 
对于问题1,绘制的位置只能接近两指定端点间的实际线段位置,例如,一条线段的位置是(10.48, 20.51),转换为像素位置就是(10,21)。 
问题2,涉及到具体的画线和填充算法,有兴趣的话可以研究。 
这个过程结束后,顶点和图元已经对应到像素,之后的流程就是如何处理像素,即给像素赋予颜色值。 
给像素赋予颜色的阶段称为Pixel Operation,是在更新帧缓存之前,执行最后一系列针对每个片段的操作,其目的是计算出每个像素的颜色值。在这个阶段,被遮挡的面通过一个被称为深度测试的过程消除。 
pixel operation包含下面这些流程: 
(1)消除遮挡面; 
(2)Texture operation,纹理操作,根据像素的纹理坐标,查询对应的纹理值; 
(3)Blending,通常称为alpha blending,根据目前已经画好的颜色,与正在计算的颜色的alpha值混合,形成新的颜色。 
(4)Filtering,将正在计算的颜色经过某种滤镜后输出。 
该阶段之后,像素的颜色值被写入帧缓存中。 

           其实只有懂得更多的深层次的知识才能熟练的把握shader,而且其实从另外一个层次来说我们要学习的并不单单是shader,而是实时渲染。

           今天就先写到这里了,欢迎大家来群里跟我交流,群号: 344682050

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以为您提供一个基本的Unity URP渲染管线镜面Shader示例。这个Shader将为物体表面创建一个镜面反射效果。 首先,您需要在Unity中创建一个新的URP项目。然后,您可以创建一个新的Shader文件并将以下代码添加到其中: ```csharp Shader "Custom/URP Mirror" { Properties { _Color ("Color", Color) = (1, 1, 1, 1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Metallic ("Metallic", Range(0, 1)) = 0.5 _Smoothness ("Smoothness", Range(0, 1)) = 0.5 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Standard fullforwardshadows #include "UnityCG.cginc" struct Input { float2 uv_MainTex; }; sampler2D _MainTex; fixed4 _Color; float _Metallic; float _Smoothness; void surf (Input IN, inout SurfaceOutputStandard o) { fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Smoothness; o.Alpha = c.a; o.Specular = 1; // 启用高光 o.Specular *= c.a; // 根据纹理透明度调整高光强度 } ENDCG } FallBack "Diffuse" } ``` 这个示例中的Shader使用了标准的SurfaceOutputStandard结构,以便与Unity URP渲染管线兼容。它具有_Color(颜色)、_MainTex(主纹理)、_Metallic(金属度)和_Smoothness(光滑度)属性,您可以在材质面板中调整它们。 Shader中的surf函数定义了如何计算表面输出。在这个例子中,我们首先从_MainTex纹理中采样颜色,并将其乘以_Color属性。然后,我们将乘以纹理透明度后的结果设置为表面的漫反射颜色(o.Albedo)。_Metallic和_Smoothness属性用于设置金属度和光滑度。 在这个示例中,我们还启用了高光(o.Specular),并根据纹理透明度调整了高光强度。 最后,请将此Shader文件保存,并将其应用于您想要添加镜面反射效果的物体上。您可以通过创建一个新材质,然后将其Shader属性设置为您创建的Shader来实现这一点。 希望这可以帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值