通常情况下,我们在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 不起作用的更多相关文章

  1. NGUI出现Shader wants normals, but the mesh UIAtlas doesn&#39;t have them

    NGUI出现Shader wants normals, but the mesh UIAtlas doesn't have them,没有网格法线,打开UI Root上 UIPanel组建上的 Nor ...

  2. NGUI 修改Shader支持灰色滤镜

    之前有人做过,不过效率不高: http://blog.csdn.net/onerain88/article/details/12197277  他的代码: fixed4 frag (v2f i) : ...

  3. 关于NGUI Shader 和 Draw Call的优化 & 模糊shader

    序: 1.项目过程中不可避免的需要用到大量Shader 和 UITexture,由于Ngui对Shader支持非常糟糕,导致项目drawCall异常的高 2.Panel裁剪无法裁剪自定义shader内 ...

  4. 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  5. NGUI图片闪光

    先上效果 Shader Shader "Unlit/Transparent Colored Flow Texture" { Properties { _MainTex (" ...

  6. 【淡墨Unity3D Shader计划】一间 创建一个游戏场景 &amp; 第一Shader写作

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  7. 【浅墨Unity3D Shader编程】之中的一个 夏威夷篇:游戏场景的创建 &amp; 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  8. NGUI 层级关系控制

    NGUI元素的遮挡情况是不依赖空间关系,所以在NGUI上添加特效有时候特别蛋疼,特别是美术同学还要依赖空间关系来控制特效效果,那先看看看NGUI的层级是怎么处理的,不过下面的描述都是针对单个相机下的P ...

  9. [cb]NGUI组件基类之 UIWidget

    UIWidget NGUI的UIWidget是所有组件的基类,它承担了存储显示内容,颜色调配,显示深度,显示位置,显示大小,显示角度,显示的多边形形状,归属哪个UIPanel.这就是UIWidget所 ...

随机推荐

  1. Android SDK的安装与环境变量配置

    配置Andriod环境变量前提是要先安装好JAVA环境 1.下载Android SDK,点击安装,直接默认路径即可! 下载地址:http://developer.android.com/sdk/ind ...

  2. linux获取本机ip

    int get_ip ( in_addr_t addrs[], int asize  ) {         int MAXINTERFACES=16;         int i = 0;     ...

  3. 代码中AggregateException的处理

      在async方法中,发生一个异常时,代码并不会直接跳到catch语句中去,而是继续执行,所以到最后catch语句中得到的错误信息是one or more exceptions occurs- 这样 ...

  4. 针对bootstrap内联单选框input与文字不能居中对齐的解决办法

    1.html代码 <div > <label class="checkbox-inline first-label"> <input type=&qu ...

  5. callback转Promise

    环境:  nodejs - v6.2.0 const fs = require('fs'); let Promise = require('bluebird'); let readSync = fun ...

  6. mysql 用source 导入数据库报错

    平时一直使用phpmyadmin或mysqldum进行导出,使用source命令导入数据库. 但换了新版本mysql后,上述导入方法出现以下错误: ERROR: Unknown command '\\ ...

  7. 安装XMind

    XMind是一款思维导图软件.可编辑整理头脑中的想法,以使其脉络更加清晰. 在学习知识过程中,用这个工具也不错. 官方网站:  http://www.xmind.net 其它版本: http://ww ...

  8. HashMap、HashTable、LinkedHashMap和TreeMap用法和区别

    Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap.HashTable.LinkedHashMap和TreeMap.本节实例主要介绍这4中实例的用 ...

  9. C# POST请求

    public string PostWebRequest(string postUrl, string paramData, Encoding dataEncode) { string ret = s ...

  10. uvm - dut

    module dut(clk, rst_n, rxd, rx_dv, txd, tx_en); input clk; input rst_n; :] rxd; input rx_dv; :] txd; ...