NGUI Material Shader SetFloat 不起作用
通常情况下,我们在Unity3d种可以通过material.SetFloat(name, xxx) 修改参数来达到我们的Material[Shader]的效果.
但是在 NGUI 的UITexture中,除了初始化时调用可以生效之外, 在Update或其他地方修改参数均不起效.
其原因是 NGUI 已经将calldraw作了缓存(没细查),我们可以在设置后调用 RemoveFromPanel 和 SetDirty 来进行重建:
实例:
void SetFloat(UITexture t, string name, float v)
{
var m = t.material;
m.SetFloat(name, v);
t.RemoveFromPanel();
t.SetDirty();
}
当然这会导致 Panel重建,慎用.
更新:这个问题真的是误人子弟了... 以下更新下正常的使用方法:
public UITexture tex;
void Start(){
tex.onRender += mat =>{
mat.SetFloat("key", 0.5f);
};
}
首先得明白NGUI 的原理, NGUI 因为图片与图片之间通过 设置 Depth 来确定图片的绘制顺序,并不能单纯使用z轴来设定.
所以NGUI内部有自己渲染排序方式.具体查看:
NGUI的流光shader解决方案
.以下为部分摘录
NGUI的onRender 大家可能会奇怪,上面的代码中的onRender什么鬼,我直接在脚本内部,起个定时器什么的来修改shader的参数不就行了吗。有兴趣的同学可以尝试一下,不管用的。 这个问题一开始我也遇到了,google一下,原来这和NGUI的渲染机制有关。大概解释一下:
NGUI在渲染的时候,大家都知道,会合并DrawCall,合并的必然是使用同一材质球的元素,NGUI内部会新建一个Material,然后UIDrawCall会进行一次渲染,渲染的时候就会调用onRender这个回调,并且把这个新建的Material传过来,方便我们做一些自定义的操作
看看UIWidget中的onRender定义大家也就都明白了:
/// <summary>
/// Set the callback that will be triggered when the widget is being rendered (OnWillRenderObject).
/// This is where you would set material properties and shader values.
/// </summary> public UIDrawCall.OnRenderCallback onRender
{
...
}
NGUI Material Shader SetFloat 不起作用的更多相关文章
- NGUI出现Shader wants normals, but the mesh UIAtlas doesn't have them
NGUI出现Shader wants normals, but the mesh UIAtlas doesn't have them,没有网格法线,打开UI Root上 UIPanel组建上的 Nor ...
- NGUI 修改Shader支持灰色滤镜
之前有人做过,不过效率不高: http://blog.csdn.net/onerain88/article/details/12197277 他的代码: fixed4 frag (v2f i) : ...
- 关于NGUI Shader 和 Draw Call的优化 & 模糊shader
序: 1.项目过程中不可避免的需要用到大量Shader 和 UITexture,由于Ngui对Shader支持非常糟糕,导致项目drawCall异常的高 2.Panel裁剪无法裁剪自定义shader内 ...
- 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- NGUI图片闪光
先上效果 Shader Shader "Unlit/Transparent Colored Flow Texture" { Properties { _MainTex (" ...
- 【淡墨Unity3D Shader计划】一间 创建一个游戏场景 & 第一Shader写作
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- 【浅墨Unity3D Shader编程】之中的一个 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- NGUI 层级关系控制
NGUI元素的遮挡情况是不依赖空间关系,所以在NGUI上添加特效有时候特别蛋疼,特别是美术同学还要依赖空间关系来控制特效效果,那先看看看NGUI的层级是怎么处理的,不过下面的描述都是针对单个相机下的P ...
- [cb]NGUI组件基类之 UIWidget
UIWidget NGUI的UIWidget是所有组件的基类,它承担了存储显示内容,颜色调配,显示深度,显示位置,显示大小,显示角度,显示的多边形形状,归属哪个UIPanel.这就是UIWidget所 ...
随机推荐
- shell脚本的执行方式
编写好的shell脚本(如:test),可以采取两种方式进行运行: 一. $ sh test 一般不采用这种调用方式,尤其不采用"sh<test"的调用方式,因为这种方式将禁 ...
- prolog --寻找neni (2)
混合查询 我们可以把简单的查询连接起来,组成复杂的查询. ?- location(X,kitchen),edible(X). 简单查询只有一个目标,而混合查询可以把这些目标连接起来.从而进行较为复杂的 ...
- UVa 488 - Triangle Wave
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=94&page=s ...
- HTML5 canvas beginPath() 方法
beginPath() 方法开始一条路径,或重置当前的路径.w3school上的解释! 路径是canvas里很重要的一个概念,刚开始学canvas的人对路径理解不是很深,他们在用canvas的时候会乱 ...
- Linux驱动学习之常用的模块操作命令
1.常用的模块操作命令 (1)lsmod(list module,将模块列表显示),功能是打印出当前内核中已经安装的模块列表 (2)insmod(install module,安装模块),功能是向当前 ...
- 如何在HTML中加载Flash(2种实现方法)_HTML/Xhtml_网页制作
点评:如何在HTML中加载Flash,为网页添加更多的色彩,普通的网页以无法满足用户的需求,接下来为大家介绍下2种在HTML中加载Flash的方法,感兴趣的各位可以适当参考下,希望对你有所帮助 第一种 ...
- cdnbest节点安装后连不上主控常见问题
1. 查看节点程序是否启动 ps -aux |grep kangle 2. 如果节点程序都有启动,可查看日志,节点连接的是不是你帐号的uid帐号或者是否有其他报错信息 tail -f /var/log ...
- [Swift] 疑难杂症
[Swift] 疑难杂症 1.class .... has no initializers --> class 的每一个元素都需要初始化,否则会报错,除了可空元素
- linux命令(1):ls命令
ls命令是linux下最常用的命令. ls命令就是list的缩写,缺省下ls用来打印出当前目录的清单,如果ls指定其他目录,那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看lin ...
- 【splay模板】
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> ...