在CG/HLSL中访问着色器的内容

Posted gameDesigner

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在CG/HLSL中访问着色器的内容相关的知识,希望对你有一定的参考价值。

着色器在Properties代码块中声明 材质球的各种特性。如果你想要在着色器程序中使用这些特性,你需要在CG/HLSL中声明一个变量,这个变量需要与你要使用的特性拥有同样的名字和对的上号的类型。比如以下这些类型:

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

在CG/HLSL代码中,要使用他们,就需要声明如下变量:

fixed4 _MyColor;
float4 _MyVector;
sampler2D _MyTexture;
sampleCUBE _MyCubemap;

属性的值如何提供给着色器

在这些地方找到着色器属性值并提供给着色器:

  • 在材质特性区域设置的每个渲染器值。这个是典型的“每个实例”型数据(一堆共享一个材质球的物体,却可以单独定制各自的颜色)
  • 在被渲染的物体上的材质的设置值。
  • 全局着色器属性,要么通过unity自带渲染代码,要么从你自己的代码中获取。

上面三点的优先级顺序为:实例属性值覆盖所有值;然后是材质数据被使用;最后如果着色器属性在这两者(实例、材质球数据)中都不存在,那么使用全局属性。最后,如果着色器中没有属性定义,那么“缺省”(float是0,颜色是黑色,贴图是空的白图)值被使用。

序列化和运行时 材质球属性

材质球可以包含 序列化的和运行时设置的属性值。

 

序列化数据是定义在shader 属性代码块中的所有数据。通常来说,这些值需要被存储在材质球中,并且用户可以在Inpsector面板中编辑他们。

 

一个材质球也可以有一些没有被定义在 属性代码块中,但是也可以被shader使用的属性。典型的案例是这些属性是在运行时通过脚本设置的。比如 Material.SetColor.注意矩阵和数组都只能存在于非序列化的运行时属性中。(因为属性块中没法定义矩阵与数组)。

 

特别的贴图属性

对于每一个被设置为 shader/材质球的 属性的贴图,unity也设置了一些额外的信息到额外的向量属性中去。

Texture tiling & offset

材质球的贴图属性中通常都有缩放和偏移量字段。这个信息是通过一个float4{TextureName}_ST传给着色器的;

属性:

  • x 包含 X 方向缩放值
  • y 包含 Y方向缩放值
  • z 包含 X 偏移量值
  • w 包含Y 偏移量值

举个例子,如果一个着色器抱哈一个叫_MainTex的贴图,它的缩放信息就会存储在 _MainTex_ST向量中。

Texture size

{TextureName}_TexelSize - 一个float4属性包含了贴图的尺寸信息:

  • x 包含 1.0/宽度
  • y 包含 1.0/高度
  • z 包含 宽度
  • w 包含 高度

Texture HDR 参数

{TextureName}_HDR - 根据所使用的颜色空间,一个float4属性包含如何解码潜在HDR(例如rgbm编码)纹理的信息。

Color space and color/vector shader data

当使用 线性颜色空间,所有的材质球颜色属性都提供的是sRGB颜色,但是会转换为线性值再传递给着色器。

 

比如,如果你的 着色器属性代码块包含一个颜色 属性,叫做“MyColor”,然后对应的“MyColor” HLSL变量将会得到这个颜色的线性值。

 

对于那些被标记为Float 或者Vertor的类型属性,默认情况下没有颜色空间转换;它们被假定不包含颜色信息。给float/vector属性加上[Gamma]特性,然后用来表明它们是特别的sRGB 空间,就像这样是可以的。

 

以上是关于在CG/HLSL中访问着色器的内容的主要内容,如果未能解决你的问题,请参考以下文章

Unity-ShaderLab入门 Shader是什么?

UnityShader之顶点片段着色器Vertex and Fragment ShaderShader资料

带有顶点/片段着色器的光。使用不同的变量。 (openGL)

片段着色器是不是处理来自顶点着色器的所有像素?

为啥 gl_Color 不是片段着色器的内置变量?

使用制服时 Xamarin OpenGL 片段着色器的奇怪行为