在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中访问着色器的内容的更多相关文章
- 在CG/HLSL中访问着色器属性(Properties)
在CG/HLSL中访问着色器属性 Shader在Properties块中访问材质属性.如果你想在一个着色程序中访问一些属性,你需要声明一个Cg/HLSL具有相同的名称和一个匹配的类型的变量. Prop ...
- OpenGl中使用着色器的基本步骤及GLSL渲染简单示例
OpenGL着色语言(OpenGL Shading Language,GLSL)是用来在OpenGL中着色编程的语言,是一种具有C/C++风格的高级过程语言,同样也以main函数开始,只不过执行过程是 ...
- three中的着色器示例
其实在3D引擎/库的帮助下,我们做webgl开发的难度已经很大大地降低了,熟悉相关API的话,开发一个简单的3D程序可以说是很轻松的事情. 在我看来,webgl的核心就是着色器(顶点着色器.片元着色器 ...
- unity中使用的着色器语言
在unity中,着色器编程使用了一列列的HLSL语言变种(也叫作Cg,但是大部分实际上两者都是一样的). 目前,为了在不同平台下保持最好的跨平台性, 取样贴图时,最好使用DX9风格 的HLSL. 着色 ...
- WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码
原文:WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码 HLSL,High Level Shader Language,高级着色器语言,是 Di ...
- OpenGL学习脚印: uniform blocks在着色器中的使用 转自https://blog.csdn.net/wangdingqiaoit/article/details/52717963
写在前面 目前,我们在着色器中要传递多个uniform变量时,总是使用多个uniform,然后在主程序中设置这些变量的值:同时如果要在多个shader之间共享变量,例如投影矩阵projection和视 ...
- BGFX 渲染引擎中着色器代码的调试方法
在实时渲染的图形开发中,着色器代码(Shader)越来越复杂,于是单纯的靠经验和不断试错的开发和调试方法早已不能满足实际需求.使用调试工具进行调试,成为开发中重要的方法.Bgfx 是一款跨平台.抽象封 ...
- Unity 渲染教程(二):着色器基础
转载:https://www.jianshu.com/p/7db167704056 这是关于渲染基础的系列教程的第二部分.这个渲染基础的系列教程的第一部分是有关矩阵的内容.在这篇文章中我们将编写我们的 ...
- Initialize the shader 初始化着色器
目录 Loads the shader files and makes it usable to DirectX and the GPU 加载着色器文件并使其可用于DirectX和GPU Compil ...
随机推荐
- __STL_VOLATILE
_Obj* __STL_VOLATILE* __my_free_list = _S_free_list + _S_freelist_index(__n); _Obj* * __my_free_list ...
- 一站式搞定Ubuntu共享环境配置
1. 添加linux用户 安装的开发用的虚拟机,一般不直接使用root账户,会新建一个普通用户,然后在/etc/sudoers添加上sudo的权限即可. 使用如下命令: sudo adduser -- ...
- idea中GitPush失败问题
首先是你的项目中有和和历史不符的东西 Push rejected: Push to *****/***** was rejected 推拒绝:推送到起源/主人被拒绝 直接是解决办法,直接打开你要上传代 ...
- 解决Android v4、v7包导入标红问题import android.support.v4.app.ActivityCompat;import android.support.v7.app
如果有如下错误:import android.support.v4.app.ActivityCompat;import android.support.v7.app.AppCompatActivity ...
- vue.js中 v-for,v-on,v-model,结合应用案例---记事本
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- HTML5+css3 的开心网游戏页面
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 极简 Node.js 入门 - 3.1 File System API 风格
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- Mybatis-04-分页
分页 思考:为什么要分页? 减少数据的处理量 1 使用limit分页 select * from user limit startIndex,pageSize;
- git 常规操作 windows版
首先在本地建立好文件夹,然后初始化git仓库: git init 接下来在github上面克隆项目: git clone 这里写你的项目地址 然后就可以修改,删除,提交代码了 如果需要在新分支上面开 ...
- Python 为什么没有 void 关键字?
void 是编程语言中最常见的关键字之一,从字面上理解,它是"空的.空集.空白"的意思,最常用于 表示函数的一种返回值类型. 维基百科上有一个定义: The void type, ...