关于NGUI主Panel下子Panel渲染Shader被修改的问题

2015年03月14日 11:58 0 点赞 1 评论 更新于 2025-11-21 17:03

在项目开发过程中,我偶然发现了NGUI主Panel下子Panel渲染Shader被修改的问题。事情的起因是项目中需要实现置灰效果,但NGUI本身的置灰功能并不理想,它只能让图像变暗,而无法达到真正的置灰效果。于是,我在网上查找解决方案,发现有高手通过修改Shader来实现这一需求。具体做法是取一个约定值,当Sprite的颜色值变为该约定值时,就显示置灰效果。由于相关方法在网上很容易通过百度搜索到,这里就不详细展开了。接下来,我将重点阐述在使用该方法时遇到的另一个问题。

使用上述方法实现置灰效果时,在正常情况下效果符合预期。然而,在运行过程中,我发现当Sprite位于ScrollView下,且该ScrollView又是主Panel的子控件时,置灰效果无法正常显示,Sprite变成了真正的纯黑色图片。这是为什么呢?

经过一番深入排查,我找到了问题的根源。在NGUI的UIDrawCall.cs文件中有如下一段代码:

Shader shader;
mLegacyShader = false;
mClipCount = panel.clipCount;

if (mClipCount != 0)
{
shader = Shader.Find("HIDDEN/" + shaderName + " " + mClipCount);
if (shader == null)
shader = Shader.Find(shaderName + " " + mClipCount);

// Legacy functionality
if (shader == null && mClipCount == 1)
{
mLegacyShader = true;
shader = Shader.Find(shaderName + soft);
}
}
else
shader = Shader.Find(shaderName);

这段代码的主要逻辑是用于替换子Panel的Shader。需要说明的是,ScrollView自带一个UIPanel,当ScrollView挂在一个UIPanel下面或者其子集下面时,ScrollView就变成了子Panel。该代码会让原本使用的Shader自动添加一个1。例如,如果原来使用的Shader是AShader,那么此时Shader就会变成AShader 1。这就解释了为什么添加在子Panel里的Sprite置灰效果无法正常工作,因为Shader被替换了,不再是我们之前修改过的那个Shader。要解决这个问题,我们只需要对这部分代码进行相应的修改即可。

作者信息

boke

boke

共发布了 3994 篇文章