zoukankan      html  css  js  c++  java
  • [转]解读Unity中的CG编写Shader系列1——初识CG

    CG=C for Graphics  用于计算机图形编程的C语言超集

    前提知识点:

    1.CG代码必须用

    CGPROGRAM

    。。。

    ENDCG括起来

    2.顶点着色器与片段着色器的主函数名称可随意,但需要再#pragma vert 与#pragma fragment中声明并且与主函数名完全匹配,shader才会找到入口

    3.float4是一种压缩数组,float4 vert与float vert[4]严格意义上讲不同,虽然都是存放4个float,但float4作为向量类型做点乘、内积等处理更快速

    4.语义 :变量除了变量名与数据类型之外,还在:后声明其语义

    例子一:RGB立方体

    例题阐述:

    给一个立方体(cube)创建一个shader,在立方体的直角坐标系中,三个坐标x,y,z的取值范围为{0,0,0}至{1,1,1},而RGBA颜色red,green,blue,alpha的取值范围正好是{0,0,0,0}至{1,1,1,1},将alpha写死为1,那么r,g,b分别与x,y,z建立一一映射,可得到一个6个面展示所有RGB颜色的立方体如图:

    具体代码及其含义如下:

    [csharp] view plain copy
     
     print?
    1. Shader "Custom/RGBCube" {  
    2.     SubShader   
    3.     {  
    4.         Pass {  
    5.         CGPROGRAM  
    6.         #pragma vertex vert //顶点着色器入口函数声明  
    7.         #pragma fragment frag // 片段着色器入口函数声明  
    8.         //顶点输出结构体  
    9.         struct vertexOutput {  
    10.             //声明结构体的成员pos,类型为float类型的4元向量,语义为SV_POSITION,col同理;  
    11.             float4 pos : SV_POSITION;  
    12.             float4 col : TEXCOORD0;  
    13.         };  
    14.         //顶点着色器入口函数vert,与pragma第一条声明匹配,返回类型为刚刚定义的顶点输出结构体  
    15.         vertexOutput vert(float4 vertexPos : POSITION)  
    16.           
    17.         {  
    18.             vertexOutput output; //这里不需要struct关键字  
    19.             //顶点着色器将数据写入输出结构体中。  
    20.             output.pos = mul(UNITY_MATRIX_MVP, vertexPos);  
    21.             //mul是顶点变换函数,UNITY_MATRIX_MVP是unity的内建矩阵,vertexPos是这个函数的形参  
    22.             //此行代码的作用为将形参vertexPos(本例即Cube对象的顶点向量)按照unity的内建矩阵进行顶点变换  
    23.             output.col = vertexPos + float4(0.5, 0.5, 0.5, 0.0);  
    24.             //这行代码是实现RGB立方体的关键  
    25.             //vertexPos的值域为题干所提到的x,y,z三元组各自减去0.5构成的值域  
    26.             //但是这里接受的类型为float4,可见第四元应该是无意义的常数1  
    27.             //意思是vertexPos的值域为{-0.5,-0.5,-0.5,1}至{0.5,0.5,0.5,1}  
    28.             //而对这个值域进行+{0.5,0.5,0.5,0}的矢量相加才能得到RGB (A恒定为1)的所有颜色区间  
    29.               
    30.             return output;  
    31.             //将输出结构体返回,进入下一个环节(简单理解为给片段着色器)  
    32.             //ps:更细致的环节有顶点变换-->顶点着色-->几何元的构建-->光栅化几何元  
    33.             //-->片段着色-->略  
    34.         }  
    35.         //片段着色器入口函数frag,与pragma第二条声明匹配,返回类型为float4语义为COLOR,  
    36.         //这里除了颜色没有其他的输出,所以没有输出结构体  
    37.         float4 frag(vertexOutput input) : COLOR   
    38.         //此函数的形参类型为顶点着色器的输出结构体,没有语义  
    39.         //原因就在于片段着色器位于顶点着色器的下一个环节,参数按照这个顺序传递  
    40.         {  
    41.             //由于col属性已经在顶点着色器中计算,直接返回进入下一环节  
    42.             //下一环节是什么这里不探讨了  
    43.             return input.col;  
    44.         }  
    45.         ENDCG  
    46.         }  
    47.     }  
    48.     //如果以上SubShader渲染失败则回滚采用Diffuse  
    49.     FallBack "Diffuse"  
    50. }  



    补充:

    刚刚写掉了,为何vertexPos的值域为{-0,5,-0.5,-0.5,1}至{0.5,0.5,0.5,1}而非{0,0,0,1}至{1,1,1,1}呢?

    因为我们的直角坐标系原点没有在顶点上而是在cube的几何中心,故其值域为{-0,5,-0.5,-0.5,1}至{0.5,0.5,0.5,1},over 

  • 相关阅读:
    219. Contains Duplicate II
    189. Rotate Array
    169. Majority Element
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    119. Pascal's Triangle II
    118. Pascal's Triangle
    88. Merge Sorted Array
    53. Maximum Subarray
    CodeForces 359D Pair of Numbers (暴力)
  • 原文地址:https://www.cnblogs.com/decode1234/p/6930522.html
Copyright © 2011-2022 走看看