zoukankan      html  css  js  c++  java
  • Shader的函数公式以及使用的场景

    Shader 是干什么的?

    它的作用可以先简单理解为对屏幕上的物体,进行颜色处理。

    而大家都知道,所有计算机,处理颜色的当然是显卡,也就是 GPU 。

    所以我们写 Shader 的目的就是告诉 GPU ,我需要对物体的颜色,纹理,等方面,怎样处理,达到我们想要的效果。

    UnityCG.cginc中一些常用的函数

    //摄像机方向(视角方向)
    float3 WorldSpaceViewDir(float4 v)      根据模型空间中的顶点坐标 得到 (世界空间)从这个点到摄像机的观察方向
    float3 UnityWorldSpaceViewDir(float4 v) 世界空间中的顶点坐标==》世界空间从这个点到摄像机的观察方向
    float3 ObjSpaceViewDir(float4 v)        模型空间中的顶点坐标==》模型空间从这个点到摄像机的观察方向
    //光源方向
    float3 WorldSpaceLightDir(float4 v)     模型空间中的顶点坐标==》世界空间中从这个点到光源的方向
    float3 UnityWorldSpaceLightDir(float4 v)    世界空间中的顶点坐标==》世界空间中从这个点到光源的方向
    float3 ObjSpaceLightDir(float4 v)   模型空间中的顶点坐标==》模型空间中从这个点到光源的方向
    //方向转换
    float3 UnityObjectToWorldNormal(float3 norm) 把法线方向 模型空间==》世界空间
    float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空间=》世界空间
    float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空间=》模型空间
    

    什么是OpenGL、DirectX
    shader可以认为是一种渲染命令 ,由opengl 或者dx进行解析,来控制渲染丰富多彩的图形

    OpenGL 使用GLSL 编写shader
    DirectX 使用HSSL 编写shader
    英伟达 CG 编写shader(跨平台)

    Unity Shader的分类
    使用的是ShaderLab编写Unity中的Shader
    1,表面着色器 Surface Shader
    2,顶点/片元着色器 Vertex/Fragment Shader
    3,固定函数着色器 Fixed Function Shader

    Unityshader中属性的类型有哪些
    _Color(“Color”,Color)=(1,1,1,1)
    _Vector(“Vector”,Vector)=(1,2,3,4)
    _Int(“Int”,Int)= 34234
    _Float(“Float”,Float) = 4.5
    _Range(“Range”,Range(1,11))=6
    _2D(“Texture”,2D) = “red”{}
    _Cube(“Cube”,Cube) = “white”{}
    _3D(“Texure”,3D) = “black”{}

    从应用程序传递到顶点函数的语义有哪些a2v
    POSITION 顶点坐标(模型空间下的)
    NORMAL 法线( 模型空间下)
    TANGENT 切线(模型空间)
    TEXCOORD0 ~n 纹理坐标
    COLOR 顶点颜色

    从顶点函数传递给片元函数的时候可以使用的语义
    SV_POSITION 剪裁空间中的顶点坐标(一般是系统直接使用)
    COLOR0 可以传递一组值 4个
    COLOR1 可以传递一组值 4个
    TEXCOORD0~7 传递纹理坐标

    片元函数传递给系统
    SV_Target 颜色值,显示到屏幕上的颜色

    什么是光照模型
    光照模型就是一个公式,使用这个公式来计算在某个点的光照效果

    标准光照模型
    在标准光照模型里面,我们把进入摄像机的光分为下面四个部分
    自发光
    高光反射
    Blinn光照模型
    Specular=直射光 * pow( max(cosθ,0),10) θ:是反射光方向和视野方向的夹角
    Blinn-Phong光照模型
    Specular=直射光 * pow( max(cosθ,0),10) θ:是法线和x的夹角 x 是平行光和视野方向的平分线
    漫反射 Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) ) cosθ = 光方向· 法线方向
    环境光

    Tags{ “LightMode”=”ForwardBase” }
    只有定义了正确的LightMode才能得到一些Unity的内置光照变量

    include “Lighting.cginc”

    包含unity的内置的文件,才可以使用unity内置的一些变量

    normalize() 用来把一个向量,单位化(原来方向保持不变,长度变为1)
    max() 用来取得函数中最大的一个
    dot 用来取得两个向量的点积
    _WorldSpaceLightPos0 取得平行光的位置
    _LightColor0取得平行光的颜色
    UNITY_MATRIX_MVP 这个矩阵用来把一个坐标从模型空间转换到剪裁空间
    _World2Object 这个矩阵用来把一个方向从世界空间转换到模型空间
    UNITY_LIGHTMODEL_AMBIENT用来获取环境光

    半兰伯特光照模型
    Diffuse = 直射光颜色 *( cosθ *0.5 +0.5 )
    兰伯特光照模型
    Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) ) cosθ = 光方向· 法线方向

    shader中的各种空间坐标
    http://blog.csdn.net/lyh916/article/details/50906272
    什么是切线空间
    http://blog.csdn.net/bonchoix/article/details/8619624

    pixel = (normal+1)/2

    normal = pixel*2 - 1

  • 相关阅读:
    原创:Qt自定义拖放
    看下最近公司的招聘需求
    leveldb阅读心得
    Relationship between the FIX Protocol's OrdID, ClOrdID, OrigClOrdID?
    Wait Functions
    全局变量与单例模式
    Asynchronous I/O
    QuickFix MsgHandler
    第一个Java程序
    (原創) Function Pointer、Delegate和Function Object (C/C++) (template) (.NET) (C#)
  • 原文地址:https://www.cnblogs.com/chinarbolg/p/9601467.html
Copyright © 2011-2022 走看看