shader相关的面试题整理1

1  3维模型有那些组成

  mesh  和纹理

2   渲染管线

     1)顶点数据 
(2)几何阶段: 
顶点着色器→曲面细分着色器→几何着色器→裁剪→屏幕映射(→传递数据给光栅化阶段) 
(3)光栅化阶段: (光栅化计算:显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。 )
三角形设置→三角形遍历→片元着色器→逐片元操作 
(4)屏幕图像

 

 

 

shader实现半透明效果

Shader "Unlit/HalfTransparent"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
       _Scale("Scale",Range(0,1))=1
    }
    SubShader
    {
        Tags { "RenderType"="Transparent"  "Queue" = "Transparent" }
    

        Pass
        {
           ZWrite Off
           Blend SrcAlpha OneMinusSrcAlpha
           
           CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog
            #include "Lighting.cginc"
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed _Scale;
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog                
                return fixed4(col.rgb,col.a*_Scale);
            }
            ENDCG
        }
    }
}

核心点:   

         Tags(''RenderType''="Transparent" "Queue"="Transparent"}

          ZWrite Off 关掉深度写入

          Blend ScrAlpha OneMinusScrAlpha   (Alpha混合   srcalpha:源透明值  oneminusalpha:1-源透明值    最终颜色 = 源颜色 * 源透明值 + 目标颜色*(1 - 源透明值))

          参考

4  前向渲染和后向渲染

    

在大多数情况下,我们可以通过Edit->Project Settings->Player->Other Settings->Rendering->Path中选择需要渲染的路径,默认是前向渲染路径。
但是我们也可以在Camera中单独设置这个摄像机的渲染路径。

在Shader中,通过指定Pass中的LightMode标签来实现:

Pass{
Tags { "LightMode" = "ForwardBase" }
 

前向渲染路径
传统且常见的渲染方式。
原理:
Unity将各种光照按逐顶点处理、逐像素处理、球谐函数SH等方法计算出并混合。至于怎么处理:
1. 最多有四个光源按逐顶点处理
2. 场景中最亮的平行光是逐像素处理的
3. 被设置成not important,会按逐顶点或SH处理
4. Important的会逐像素处理
5. 如果逐像素渲染的数量小于Quality Setting中的逐像素数量,则会有更多的光源进行逐像素处理

使用#pragma multi_compile_fwdbase这样的编译指令,可以让Pass生成所有需要的Shader变种。

延迟渲染路径
当场景之中包含大量光源的时候,前向渲染的性能会急速下降。所以需要延迟渲染。
延迟渲染使用了一个叫G-缓冲的缓冲区(G-Buffer)。
延迟渲染主要包含了两个Pass
一、在Pass1中,不进行任何光照计算,而仅仅计算哪些片元是可见的,通过深度缓冲技术,如果发现可见,则把它的相关信息存储到G-缓冲中。
二、在Pass2中,理由G-缓冲中的各种信息来进行真正的光照计算。

在Unity的延迟渲染中,每个光源都可以按照逐像素的方式进行处理,但也有缺点:
1. 不支持真正的抗锯齿功能
2. 不能处理半透明物体
3. 对显卡有一定要求

延迟渲染可以访问的内置变量:
_LightColor float4类型 光源的颜色
_LightMatrix0 float4x4类型 世界空间到光源空间的变换矩阵。可以用于采样cookie和光强衰减原理。

 

5.OpenGL中要用到哪几种Buffer? 

(1)帧缓冲(Frame Buffer)
(2)颜色缓冲(Color Buffer)
(3)模板缓冲(Stencil Buffer)
(4)顶点缓冲(Vertice Buffer)
(5)深度缓冲(Depth Buffer)

 

7 Unity Shader 中的常用RenderType?

(1)Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
(2)Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器)。
(3)TransparentCutout: 蒙皮透明着色器(Transparent Cutout,两个通道的植被着色器)。
(4)Background: Skybox shaders. 天空盒着色器。
(5)Overlay: GUITexture, Halo, Flare shaders. 光晕着色器、闪光着色器。
(6)TreeOpaque: terrain engine tree bark. 地形引擎中的树皮。
(7)TreeTransparentCutout: terrain engine tree leaves. 地形引擎中的树叶。
(8)TreeBillboard: terrain engine billboarded trees. 地形引擎中的广告牌树。
(9)Grass: terrain engine grass. 地形引擎中的草。
(10)GrassBillboard: terrain engine billboarded grass. 地形引擎何中的广告牌草。

8 MeshRender中material和sharedmaterial的区别

修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。

 

Unity的Shader中,Blend SrcAlpha OneMinusSrcAlpha这句话是什么意思?

作用就是Alpha混合。公式:最终颜色 = 源颜色 x 源透明值 + 目标颜色 x(1 - 源透明值)

 

转载于:https://www.cnblogs.com/jiwen/p/11265763.html

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值