在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 ...
随机推荐
- tp3.2 新增邮件类
1.新建方法 调用发送邮件,我的目录在/admin下 2.新增邮件方法 类的发送配置功能 文件地址: 网站根目录\项目目录\Admin\Common\ 文件 名 :function.php ...
- Linux-sed命令使用笔记
Linux的sed命令和python脚本一起,可以对文本进行快速的修改.比如在删除日志的时候,python写出固定日期删除脚本,再用sed循环将python脚本的日期修改调用,就可以批删除指定日期的日 ...
- QString字符串的查找与截取实例
QString是Qt中封装的字符串类,相对于标准库里的string,使用方法有些不同,个人感觉使用qt习惯后,感觉QString更好用,下面的代码主要是针对QString的字符查找.截取做的测试: # ...
- 使用git将本地仓库上传到远程仓库(转)
第一步:创建一个工程目录 执行: git init 第二步:把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点".",意为添加文件夹下的所有 ...
- 用python分析1225万条淘宝数据,终于搞清楚了我的交易行为
大家好,我是黄同学
- C# ASP response.write()弹出提示框后页面布局被打乱
发现在使用了response.write后样式发生了变化,位置和字体都不正确.Response.Write("<script>alert(')</script>&qu ...
- 2020-07-23:开启rdb后,redis的启动流程是怎样的?
福哥答案2020-07-23: Redis 在完成初始化全局服务器配置,加载配置文件,初始化服务器,开始加载持久化的数据到内存中.如果启用了 appendonly 了,则Redis从 appendfi ...
- 从一次外卖到对oauth2.0的思考
别问oauth1.0哪去了,问就是不好讲. 1. 外卖并不好吃 今天下班得早,想吃顿好的,于是就点了一份外卖,过了一会儿,外卖到了,但是在小区大门被堵住了,我亲自远程开门后才能进来,又过了一会,被 ...
- vue_如何判断变量是数组还是对象
一.typeof判断数据类型(判断数组跟对象都返回object) console.log(typeof null); // "object" console.log(typeof ...
- 浅谈:什么是.NET
.NET是 Microsoft XML Web services 平台.XML Web services 允许应用程序通过 Internet 进行通讯和共享数据,而不管所采用的是哪种操作系统.设备或编 ...