Shader笔记(一)

本文深入探讨Unity3D中的Shader技术,从Shader1.0的固定管线到Shader2.0的顶点/片段着色器,再到Unity特有的Surface Shader。讲解了包括流水线、光照模型、顶点/片段着色器、模板测试、 Blend以及抗锯齿等关键概念,并通过CG语言介绍Shader编程,同时展示了如何利用C#进行相关代码操作。内容覆盖了漫反射、镜面反射、环境光、自发光等光照计算,以及法线贴图、边缘检测和立方体贴图的应用。
摘要由CSDN通过智能技术生成

Shader

Fixed shader: shader1.0 固定管线

Vertex/Fragment shader : shader 2.0 顶点/片段

Surface shader :Unity3d 特有的 表面

Shader1.0

开关式编程

最终呈现效果计算公式

环境光 * Unity环境光设置 +
漫反射 * 灯光的颜色 +
镜面反射 * 灯光的颜色 +
自发光

流水线

过程:

  1. 顶点着色器
  2. 光栅化
  3. 片段着色器
  4. alpha测试
  5. 模板测试
  6. 深度测试
  7. blend
  8. gbuffer
  9. framebuffer
  10. frontbuffer
  11. 显示器

shader1.0
开关式编程

shader2.0
能够编程的

  1. 顶点着色器
    1. 计算顶点的位置 MVP:以相机为坐标系,超框不显示;
    2. 计算顶点的大小
    3. 计算顶点的颜色
  2. 光栅化:
    1. 将顶点变成像素 (计算插值)
  3. 片段(像素)着色器
    1. 计算像素颜色
    2. 结合灯光计算像素的颜色
    3. 结合贴图计算像素的颜色
  4. alpha测试
    1. 淘汰像素 RGBA:根据a值淘汰i像素
  5. 深度测试
    1. 根据深度值淘汰像素(离相机远近)
  6. 模板测试
    1. 程序自定义的值淘汰像素
    2. 分辨率:1280720 float[1280720] RGBA:32bit,
    3. 颜色缓存区(RGBA float[1280720]),深度缓存区(深度值8bit Byte[1280720] 或 short[1280720]) 模板缓存区(模板值8bit Byte[1280720]):
  7. blend (每个相机都会有 模板深度颜色的buffer):
    1. 将已经渲染到屏幕上的像素和即将渲染到屏幕上的像素做混合,存到gbuffer里
  8. framebuffer、frontbuffer:
    1. 将颜色缓存区里面的东西写入framebuffer里
    2. 交换到显示器上去

Unity3D编程

  1. Fixed shader:固定管线编程 shader1.0
  2. Vertex/fragement shader:顶点 片段着色器编程shader2.0
  3. Surface shader :表面着色器编程 U3D特有

四种光

光照公式:
光照I = 自发光+环境光+漫反射+镜面反射
环境光=环境光颜色 * 环境光向量
漫反射=漫反射光颜色 * 漫反射强度 * (光源向量·法线向量)
镜面反射=镜面光颜色 * 镜面反射强度 * (反射光向量·视角方向)^n

漫反射 (Diffuse)
  1. 跟观察角无关
  2. 跟入射角有关
  3. Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) )
    Tip:cosθ = 光方向· 法线方向
镜面反射 (Specular)
  1. 跟观察角有关
  2. 跟入射角有关
  3. Specular=直射光 * pow( max(cosθ,0),10)
    θ:是反射光方向和视野方向的夹角
环境光 (Ambient)

周围环境光线

自发光 (Emission)

自己发光

Ambient + Lighting Window’s Ambient Intensity Setting + (Light Color * Diffuse + Light Color * Specular) + Emission

顶点着色器

//路径名
Shader "Custom/TestProperty"
{
    //属性:定义属性
    Properties
    {
        //1.数值,滑动条
        //2.颜色,向量
        //3.贴图
        //变量名,显示名,类型, 默认值
        _MainTex ("Texture", 2D) = "white" {}
        _TestFloat("Test float", float) = 2.5
        //GPU 只有浮点数
        _TestInt("Test int", int) = 2
        
        //滑动条
        _TestRange("TestRange", Range(1,10)) = 5
        
        //颜色
        _TestColor("TestColor", Color) = (1,1,1,1)
        
        //向量
        //四维向量xyzw,三维矩阵变换,w表示平移
        _TestVector("TestVector", Vector) = (1,1,1,1)
        
        //贴图
        _TestTexture("TestTexture", 2D) = "white" {}
        _TestCube("TestCube", Cube) = "white" {}
        _Test3D("Test3D", 3D) = "white" {}
    }
    //渲染流程:选择对应显卡,只用一个
    SubShader
    {
        //渲染通道:每出现一次就渲染一次
        //写代码
        Pass
        {
            //sahder1.0顶点着色器编程(开关式编程):
            
            //Color:表示顶点颜色的定义
//            Color (1,0,0,1)
            //使用变量
            Color[_TestColor]
            
            //Material:定义物体自身材质属性:
            
            
            
            //设置物体自身四种光,漫反射,镜面反射,环境光,自发光
            
            material{
                
            }
            //sahder1.0开关式编程
            SeparateSpecular On
            //灯光总开关
            lighting On


        }
    }
    //可以适配多个显卡
    SubShader
    {
        Pass
        {
            
        }
    }
    
    //没找到适配显卡,选择默认shader
    Fallback "Diffuse"
}

片段着色器

SetTexture指令
  • Previous是上一次SetTexture的结果
    • previous指的是先前的数据,将代码改成“combine texture * previous”,这里的意思就是用当前纹理的值去乘上当前settexture操作之前所有计算和采样过后的结果。
  • Primary是来自光照计算的颜色或是当它绑定时的顶点颜色
    • primary代表了前面所有计算材质和光照后的颜色值,将贴图和这个值相乘,就会得到一个混合的新的颜色值。
  • Texture是在SetTexture中被定义的纹理的颜色
  • Constant是被ConstantColor定义的颜色
SubShader
    {
        
        Pass
        {
            //设置图片指令
            SetTexture[_BlendTex]
            {
                //代码逻辑
                //combine texture    
                //加减乘 当前贴图颜色
                c
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值