Semantics语义词:
  定义:GPU工作时,数据通常暂存在寄存器,那么在Cg中,语义词就指定了输入/输出数据和图形硬件寄存器之间的映射关系。
  原理:根据输入语义,图形处理器从某个寄存器取数据;然后再将处理好的数据,根据输出语义,放到指定的寄存器。
      VS中绑定语义的输出数据会传递到PS中绑定相同语义的输入参数。
      语义只对VS和PS入口函数的输入/输出参数有意义,是VS/PS输入输出和寄存器之间的桥梁。
  VS输入语义词:POSITION BLENDWEIGHT NORMAL TANGENT BINORMAL PSIZE BLENDINDICES TEXCOORD0-TEXCOORD7
  VS输出语义:POSITION PSIZE FOG COLOR0-COLOR1 TEXCOORD0-TEXCOORD7
         VS的输出中必须包含POSITION语义变量,该值不能在PS中直接使用,它只被用于光栅化。
         VS的输出中的自定义数据可以使用TEXCOORD系列的语义词来表示。
  PS输入语义词:除POSITION外,VS的输出语义,也是VP的输入语义
  PS输出语义:通常只有一个输出COLOR,最终颜色值。

VS输入参数的定义:
  VS的输入参数可以是通用类型appdata_base,也可以是自定义结构体,并在其中指定需要的参数。
  [UnityGC.cginc]VS预定义输入参数:
    appdata_base:包含顶点的position、normal、one texture coordinate
    appdata_tan:包含顶点的position、tangent、normal、one texture coordinate
    appdata_full:包含顶点的position、tangent、normal、tow texture coordinate、color
  自定义输入结构示例:

  struct vertexInput
  {
  float4 vertex : POSITION;
  float4 texcoord0 : TEXCOORD0;
  fixed4 color : COLOR;
  };

  Unity中,顶点只能包含以下这些数据,所以自定义输入结构中的成员也必须在此范围内(具体类型可以不一样,比如fixed4 color):
  float4 vertex/float3 normal/float4 texcoord/float4 texcoord1/float4 tangent/float4 color
  注意:其中没有副法向量binoraml,它可以通过noraml和tangent计算得出来,公式如下所示:

    // binormal的计算公式
float3 binormal = cross( v.normal, v.tangent.xyz ) * v.tangent.w;

Cg访问属性定义:
  Cg访问Properties块中定义的变量的方式:声明同名并匹配类型的变量。
    Color/Vector --> float4/half4/fixed4
    Range/Float --> float/half/fixed
    2D --> sampler2D
    3D --> sampler3D
    Cube --> samplerCUBE
  可以看下面的例子:
  属性:

  _MyColor ("Some Color", Color) = (,,,)
  _MyVector ("Some Vector", Vector) = (,,,)
  _MyFloat ("My float", Float) = 0.5
  _MyTexture ("Texture", 2D) = "white" {}
  _MyCubemap ("Cubemap", CUBE) = "" {}

  Cg变量:

  fixed4 _MyColor; // low precision type is enough for colors
  float4 _MyVector;
  float _MyFloat;
  sampler2D _MyTexture;
  samplerCUBE _MyCubemap

  shader中的Cg片段会被Unity编辑器编译成low-level shader assembly,并被包含在生成的版本的data files里面。因为Cg片段需要被预编译,所以不能在运行时动态创建Cg shader。
  #pragma glsl_no_auto_normalization 当给移动平台编译GLSL时,不自动normalize法向量和切线向量。在IOS/Android平台,noramls和tangents会在vertex shader中自动noramize。
  #pragma exclude_renderers d3d11 xbox360 在DX11和Xbox360平台上不渲染

常用预定义和Cg函数:
  [Cg]采样2dtexture: tex2D(_MainTex, i.texcoord0);
  [Cg]frac函数:取小数部分
  [Cg]any函数:输入参数只要有其中一个不为0,则返回true
  [Cg]saturate函数:如果小于0则返回0,如果大于1则返回1,否则返回原值
  [Cg]语义词VPOS表示像素的屏幕坐标,至少需要支持target 3.0。
  [UnityCG.cginc]_ScreenParam表示屏幕的宽和高。
  [UnityCG.cginc]ComputeScreenPos(MVP_pos)该函数返回像素的屏幕坐标,不需要target 3.0的支持。

一些代码片段:

  // 3D坐标转换到2D Window坐标
return mul(UNITY_MATRIX_MVP, v.vertex); // 计算像素的屏幕坐标 方法一
vertOut vert(appdata_base v)
{
vertOut o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.scrPos = ComputeScreenPos(o.pos);
return o;
// PS中转化[0-1]:float2 wcoord = (i.scrPos.xy/i.scrPos.w);
} // 计算像素的屏幕坐标 方法二
fixed4 frag(float4 sp:VPOS) : SV_Target
{
float2 wcoord = sp.xy/_ScreenParams.xy;
...
} // 判断uv是否在[0-1]返回内,可用来做uv检查
if (any(saturate(i.uv) - i.uv))
...

Vertex and Fragment Shader的更多相关文章

  1. UnityShader之顶点片段着色器Vertex and Fragment Shader【Shader资料】

    顶点片段着色器 V&F Shader:英文全称Vertex and Fragment Shader,最强大的Shader类型,也是我们在使用ShaderLab中的重点部分,属于可编程管线,使用 ...

  2. Vertex And Fragment Shader(顶点和片段着色器)

    Vertex And Fragment Shader(顶点和片段着色器) Shader "Unlit/ Vertex­_And_Fragment_Shader " { Proper ...

  3. 3D Computer Grapihcs Using OpenGL - 07 Passing Data from Vertex to Fragment Shader

    上节的最后我们实现了两个绿色的三角形,而绿色是直接在Fragment Shader中指定的. 这节我们将为这两个三角形进行更加自由的着色——五个顶点各自使用不同的颜色. 要实现这个目的,我们分两步进行 ...

  4. Unity Shaders Vertex & Fragment Shader入门

    http://blog.csdn.net/candycat1992/article/details/40212735 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Sha ...

  5. 【Unity Shaders】Vertex & Fragment Shader入门

    写在前面 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Shader中实现描边效果的弊端,也就是只对表面平缓的模型有效.这是因为我们是依赖法线和视角的点乘结果来进行描边判 ...

  6. GLSL写vertex shader和fragment shader

    0.一般来说vertex shader处理顶点坐标,然后向后传输,经过光栅化之后,传给fragment shader,其负责颜色.纹理.光照等等. 前者处理之后变成裁剪坐标系(三维),光栅化之后一般认 ...

  7. Stage3d 由浅到深理解AGAL的管线vertex shader和fragment shader || 简易教程 学习心得 AGAL 非常非常好的入门文章

    Everyday Stage3D (一) Everyday Stage3D (二) Triangle Everyday Stage3D (三) AGAL的基本概念 Everyday Stage3D ( ...

  8. Vertex and fragment programs

    [Vertex and fragment programs] When you use vertex and fragment programs (the so called "progra ...

  9. 3D Computer Grapihcs Using OpenGL - 06 Vertex and Fragment Shaders

    从这里就接触到了可编程图形渲染管线. 下面介绍使用Vertex Shader (顶点着色器)和 Fragment Shader(像素着色器)的方法. 我们的目标是使用这两个着色器给三角形填充绿色. 添 ...

随机推荐

  1. HTML5中id可以用数字开头,但在css中不能正常使用

    昨晚在看<响应式Web设计:html5和css3实战>时,书中提到“HTML5中的ID指可以用数字开头”.这个还真不知道,于是测试了一下,发现了问题. 在H5描述中是这样说的: 在css样 ...

  2. 虚拟机安装Ubuntu到U盘

    这篇经验中特指系统安装到U盘,系统在U盘上,不是双系统,不会改变源系统的设置.只需在启动的时候选择启动路径,就可以从U盘启动你的系统.本文仅仅Ubuntu系统,举一反三可以按照此方法安装各种各样的系统 ...

  3. JAVA使用POI操作excel

    文中处理的excel是2003年以前的版本,使用HSSFworkbook,如果处理2007版本以后的excel,用XSSFworkbook,对于二者的兼容性问题,可参考 http://blog.csd ...

  4. JAVA CAS原理深度分析-转载

    参考文档: http://www.blogjava.net/xylz/archive/2010/07/04/325206.html http://blog.hesey.net/2011/09/reso ...

  5. Swift不同storyboard之间的交互

    如何实现多个Storyboard之间的切换 正如大家所知道的,Main-board是·程序运行的入口,如果找不到就会抛出异常,打开plist文件可以看到关于Main-board的描述,特别的制定了其b ...

  6. Apache HTTP Server 2.2.26 发布

    Apache遗留产品线2.2.26发布.2013-11-13 之前的版本是2013-07-02的2.2.25 同样先在开发目录下放出下载,然后放到正式目录下.修正了大量的Bug.目前的稳定版2.4系列 ...

  7. 新浪微博UWP UI意见征求

    各位园主,卑职最近在忙一些新浪微博UWP的事儿,其中有一些UI上的design和实现,拿出来见见公婆,请大家给个意见: 您是喜欢A还是B.麻烦直接回在评论区了,写A或B,愿意多写几句意见的更欢迎! 先 ...

  8. 设计模式之美:Strategy(策略)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用不同的 Strategy 处理内部状态. 别名 Policy 意图 定义一系列的算法,把它们一个个封装起来,并且使它们可以相 ...

  9. Nim教程【六】

    目前看来这是国内第一个关于Nim的系列教程 先说废话 Rust1.0已经发布了, 国内有一个人为这个事情写了一篇非常长的博客, 这篇文章我前几天草草的看了一下,只记得这位朋友追Rust的艰辛,其他内容 ...

  10. .net程序单元测试介绍

    什么是单元测试?为什么要进行单元测试?如需要进一步了解,请移步维基百科. 关于.net程序单元测试的文章,网上已经有很多,但我相信我写的这篇文章的内容是独特的,因为我在网上找了很久,都没找到关于Str ...