【Unity Shader】---数据类型和关键字

一、基本数据类型:Cg支持7种基本的数据类型

  1、float,32位浮点数据,一个符号位。浮点数据类型被所有的图形接口支持;

  2、half,16位浮点数据;

  3、int,32位整形数据

  4,fixed,12位定点数,

  5、bool,布尔数据,被所有的图形接口支持;

  6、sampler*,纹理对象的句柄,分为sampler、sampler1D、sampler2D、sampler3D、samplerCUBE和samplerRECT。

二、内置的数据类型

        基于基础数据类型,如float3,表示float类型的三维向量;同理,bool2表示布尔类型的二维向量。

注:向量最长不能超过四元,如float5  vector;//编译错误

向量的赋值:

    float2 a=float(1.0,1.0);       //编译通过

              float2 a=float(1.0f,1.0f);     //编译错误

              float3 b=float(a,0.0);          //编译通过

矩阵数据类型:

    float1X1 m1;                      //即float m1,一维矩阵

              float3X4 m34                    //3*4阶矩阵

注:X是字符,不是乘号,最大的维数为4*4阶,矩阵的初始化 float 2*2 m22={1.0,2.0,3.0,2.3};

float3 x和floatx[3]是不同的,前者为向量是内置的数据类型,而数组则是一种数据结构,不是内置的数据类型。

三、类型转换

       Cg中的类型转换有强制转换和隐式转换;如果是隐式转换则数据类型从低精度向高精度转换。如:

       float a=1.0;    half b=2.0;   loat c=a+b;      //等价于float c=a+(float)b;

       Cg语言中可以对常量数据加上类型后缀表示该数据类型的数据,如:

       float a=1.0h;     //1.0h为half类型常量数据

  这样的后缀类型有三种:

   f:表示float;

   h:表示half;

   x:表示fixed;

四、Swizzle操作符

        Cg语言中的其他操作符和高级CPU语言C++类似,包括关系操作符、逻辑操作符和位移操作符以及条件操作符。而Swizzle操作符是Cg语言中特有的,它可以将一个向量的成员取出组成一个新的向量。对于坐标或者角度等其他多维向量,Swizzle操作符(.)后接x、y、z、w分别表示原始向量的第一个、第二个、第三个和第四个元素;同样,对于颜色可以后接r、g、b和a来表示同样的索引。

例如:

              float4(a,b,c,d).xwz  等价于 float(a,d,c)

              float4(a,b,c,d).xxy  等价于 float(a,a,b)

注:Swizzle操作符只对结构体和向量使用,不能对数组使用。

五、输入数据关键字:Cg中输入数据流一般分为两类

       1、varying 参数:在Cg程序中通过语义进行绑定变量, Cg语言提供了一组语义词,用以表示参数是由顶点的那些数据初始化的,一旦这个变量使用了语义词进行绑定,那么这个变量值被初始化的同时也意味着它有了特殊的含义,如表示位置、法线等含义。语义提供了一种使用随顶点变化或随片段变化而变化的值来初始化Cg程序参数的方法,这些数据都是从应用程序输入到GPU的数据,如顶点位置、法向量、纹理坐标数据等。

       2、Uniform 参数:Uniform是用来限制一个变量的初始值的来源,当声明一个变量为Uniform类型的时候,表示这个变量的初始值来自于外部的其他环境。除了获取初始值的这点之外,Uniform关键字声明的变量和其他变量是完全一样的。通常用Uniform来定义一些与三维渲染有关的离散信息数据,并通常不会随着图元信息的变化而变化,如材质对光的反射信息。Uniform表示一个参数,通常使用     uniform表示函数的形参,不能定义一个uniform表示的局部变量。

       Unity的内置Uniform输入参数如下:

  uniform float4 _Time, _SinTime, _CosTime; // 时间量

  uniform float4 _ProjectionParams; // x = 1 or -1 (如果投影翻转就是-1)

  // y = 近平面; z = 远平面; w = 1/远平面

  uniform float4 _ScreenParams; // x = width; y = height; z = 1 +1/width; w = 1 + 1/height

     uniform float3_WorldSpaceCameraPos;

  uniform float4x4 _Object2World; //模型矩阵

  uniform float4x4 _World2Object; // 模型矩阵的逆

  uniform float4 _LightPositionRange; // xyz = pos, w = 1/range

  uniform float4 _WorldSpaceLightPos0; // 光源的位置和方向

  uniform float4x4 UNITY_MATRIX_MVP; // 模型视图投影矩阵

  uniform float4x4 UNITY_MATRIX_MV; // 模型视图矩阵

  uniform float4x4 UNITY_MATRIX_V; // 视图矩阵

  uniform float4x4 UNITY_MATRIX_P; // 投影矩阵

  uniform float4x4 UNITY_MATRIX_VP; // 视图投影矩阵

  uniform float4x4 UNITY_MATRIX_T_MV; // 模型视图矩阵的转置矩阵

  uniform float4x4 UNITY_MATRIX_IT_MV; // 模型视图矩阵的逆矩阵的转置矩阵

  uniform float4x4 UNITY_MATRIX_TEXTURE0; // 贴图纹理矩阵

  uniform float4x4 UNITY_MATRIX_TEXTURE1; //贴图纹理矩阵

  uniform float4x4 UNITY_MATRIX_TEXTURE2; //贴图纹理矩阵

  uniform float4x4 UNITY_MATRIX_TEXTURE3; //贴图纹理矩阵

  uniform float4 UNITY_LIGHTMODEL_AMBIENT; // 环境色

 

六、输入输出

       对于程图形渲染管线,可编程控制的部分只有两个,顶点着色器和片段着色器。对于编程控制这两个部分,首要的任务就是要怎么给它们传参数。Cg语言的参数传递同样也有“值传递”和“引用传递”之分。因为GPU不支持指针,所以Cg语言采用了如下的方式来修辞参数传递:

     1、in:修辞一个形参只是用于输入,进入函数体时被初始化,且该形参值的改变不会影响实参值,传递方式为值传递。

     2、out:修辞一个形参只是用于输出,进入函数体时没有被初始化,一般为函数的返回值。

     3、inout:修辞一个形参即用于输入也用于输出,这是典型的引用传递。

 

 

转载于:https://www.cnblogs.com/nanwei/p/7277417.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity Shader是一种用于在Unity引擎中创建和控制图形渲染效果的编程语言。通过使用Unity Shader,开发人员可以自定义游戏中各种物体的外观和行为,从而实现更加逼真和出色的视觉效果。 而热图(Heatmap)是一种用于显示某个区域内物体热度分布的视觉化工具。在游戏开发中,热图通常用于统计和分析玩家在游戏中的行为和偏好,以便开发人员可以根据这些数据进行游戏优化和改进。 为了创建一个热图效果,我们可以使用Unity Shader来实现。首先,我们需要将游戏中各个物体按照玩家与其的互动情况和频率进行区分,不同的行为和频率可以对应不同的颜色或者纹理。接着,我们可以在Shader中根据这些信息来着色和渲染物体,以展示物体的热度分布。 在Shader中,我们可以通过为物体添加一张热图纹理,并使用该纹理来表示物体的热度值。热图纹理可以是一张灰度图,不同的灰度值对应不同的热度。然后,我们可以使用纹理坐标和采样操作来获取每个像素对应的热度值,并根据这些值来着色和渲染物体。 除了使用纹理来表示热度分布,我们还可以使用其他的技术和效果来增强热图的可视化效果。例如,我们可以使用颜色渐变和透明度来形成平滑的过渡效果,以更好地显示物体的热度变化。我们还可以添加动画效果,使热图效果更加生动和有趣。 总结而言,Unity Shader可以用于创建热图效果,通过着色和渲染来展示物体的热度分布。这样的热图可以帮助开发人员分析游戏中玩家的行为和偏好,从而优化和改进游戏的设计和内容。这些热图效果能够增强游戏的可视化效果,并提供有价值的数据供开发人员参考。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值