<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>风牛菜籽 &#187; shader</title>
	<atom:link href="http://www.caiyanpei.com/tag/shader/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.caiyanpei.com</link>
	<description>拖延症重症患者</description>
	<lastBuildDate>Tue, 25 Mar 2025 01:51:19 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6.1</generator>
		<item>
		<title>Unity Shader：从“五彩斑斓的黑”到丝滑渲染的调试探索</title>
		<link>http://www.caiyanpei.com/unity_shader_debug_check/</link>
		<comments>http://www.caiyanpei.com/unity_shader_debug_check/#comments</comments>
		<pubDate>Sun, 23 Apr 2023 12:46:26 +0000</pubDate>
		<dc:creator>tsai</dc:creator>
				<category><![CDATA[shader]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[调优]]></category>
		<category><![CDATA[unity]]></category>

		<guid isPermaLink="false">http://www.caiyanpei.com/?p=653</guid>
		<description><![CDATA[在Unity中编写Shader时，常常会遇到一些令人抓狂的问题：颜色显示异常、光 &#8230; <a href="http://www.caiyanpei.com/unity_shader_debug_check/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>在Unity中编写Shader时，常常会遇到一些令人抓狂的问题：颜色显示异常、光照计算错误、性能突然暴跌，甚至直接导致屏幕“五彩斑斓”或完全黑屏。由于Shader代码在GPU上执行，无法像C#一样逐行调试，这让问题定位变得异常困难。本文探讨几个实用调试技巧，一起尝试下驯服“暴躁”的Shader代码。</p>
<hr />
<h1>​<strong>一、基础调试工具：你的Shader显微镜</strong></h1>
<h2>1. ​<strong>假色输出法（False Color Debugging）​</strong></h2>
<p>当计算结果超出预期范围时，将中间值映射为可视颜色是最直接的调试方式。</p>
<p><strong>示例：​</strong></p>
<pre><code>// 将法线向量可视化（范围[-1,1] → [0,1]）
fixed4 frag (v2f i) : SV_Target {
    float3 normal = i.worldNormal * 0.5 + 0.5; // 映射到颜色范围
    return fixed4(normal, 1.0);
}</code></pre>
<p>通过逐步替换输出值，可以快速定位哪一步计算出现了异常。</p>
<h2>2. ​<strong>分阶段注释法</strong></h2>
<p>将复杂的Shader拆分成多个阶段，逐步启用/禁用代码块：</p>
<ul>
<li>注释掉光照计算，仅输出基础颜色</li>
<li>逐步启用法线贴图、高光、阴影等模块</li>
<li>使用宏定义快速切换（如 <code>#define ENABLE_SPECULAR 0</code>）</li>
</ul>
<h2>3. ​<strong>Unity帧调试器（Frame Debugger）​</strong></h2>
<ul>
<li>​<strong>路径：Window &gt; Analysis &gt; Frame Debugger</strong></li>
<li>逐帧查看Draw Call的执行顺序</li>
<li>检查渲染目标（Render Texture）的中间结果</li>
<li>验证Uniform变量（如矩阵、光照参数）是否正确传递</li>
</ul>
<hr />
<h1>​<strong>二、高级武器库</strong></h1>
<h2>1. ​<strong>RenderDoc：GPU级别的侦探工具</strong></h2>
<ul>
<li>​<strong>适用场景</strong>：深度分析渲染管线、纹理采样、缓冲区内容</li>
<li>​<strong>操作步骤</strong>：
<ol>
<li>在Unity中启动游戏并触发问题</li>
<li>使用RenderDoc捕获一帧</li>
<li>检查Shader输入/输出、纹理坐标、顶点数据</li>
</ol>
</li>
<li>​<strong>关键功能</strong>：
<ul>
<li>查看每个像素的历史记录（Pixel History）</li>
<li>动态修改Shader变量并实时预览</li>
</ul>
</li>
</ul>
<h2>2. ​<strong>Shader Variant剥离（Preprocessor魔法）​</strong></h2>
<p>通过自定义预处理指令，快速定位多平台兼容性问题：</p>
<pre><code>#pragma shader_feature _USE_NORMAL_MAP
// ...
#if _USE_NORMAL_MAP
    // 法线贴图相关代码
#endif</code></pre>
<p>在材质面板中切换<code>_USE_NORMAL_MAP</code>开关，观察表现差异。</p>
<h2>3. ​<strong>GPU Instancing的“陷阱”​</strong></h2>
<p>当使用<code>UNITY_INSTANCING_BUFFER_START</code>时，若出现数据错乱：</p>
<ul>
<li>检查<code>unity_WorldTransformParams</code>是否正确处理</li>
<li>在Vertex Shader中输出实例ID，验证数据索引：
<pre><code>float instanceID = (float)unity_InstanceID;
return fixed4(instanceID, 0, 0, 1);</code></pre>
</li>
</ul>
<hr />
<h1>​<strong>三、常见问题急救手册</strong></h1>
<h2>​<strong>1. 颜色全黑/全白？先检查这些！​</strong></h2>
<ul>
<li>​<strong>UV坐标错误</strong>：输出UV为颜色，观察是否超出[0,1]范围</li>
<li>​<strong>法线方向错误</strong>：在片段着色器中返回<code>fixed4(i.normal * 0.5 + 0.5, 1)</code></li>
<li>​<strong>光照向量计算错误</strong>：手动硬编码光照方向测试</li>
<li>​<strong>Alpha通道问题</strong>：检查混合模式（Blend）和深度写入（ZWrite）</li>
</ul>
<h2>​<strong>2. 性能断崖下跌？GPU在“燃烧”什么？</strong></h2>
<ul>
<li>​<strong>过度分支</strong>：避免在片段着色器中使用<code>if</code>语句，改用<code>step()</code>或<code>lerp()</code></li>
<li>​<strong>采样次数爆炸</strong>：合并纹理采样（如使用RGBA通道存储不同数据）</li>
<li>​<strong>精度问题</strong>：将不必要的<code>float</code>改为<code>half</code>或<code>fixed</code></li>
<li>​<strong>隐藏的循环</strong>：检查<code>for</code>循环是否在片段着色器中意外执行多次</li>
</ul>
<h2>​<strong>3. 平台差异：为什么Android和PC表现不同？</strong></h2>
<ul>
<li>​<strong>精度差异</strong>：移动端GPU的<code>half</code>可能只有10位精度</li>
<li>​<strong>纹理压缩格式</strong>：检查ASTC/RGBA32等格式的兼容性</li>
<li>​<strong>ES3.0限制</strong>：避免使用<code>tex2Dlod</code>等需要Shader Model 3.0以上特性的函数</li>
</ul>
<hr />
<h1>​<strong>四、防御性编码</strong></h1>
<h2>1. ​<strong>数学计算的“安全网”​</strong></h2>
<ul>
<li>使用<code>saturate()</code>函数限制数值范围：
<pre><code>float specular = saturate(dot(N, L)); // 避免负数导致意外结果</code></pre>
</li>
<li>除法保护：<code>(a + 1e-5) / (b + 1e-5)</code></li>
</ul>
<h2>2. ​<strong>Debug宏的妙用</strong></h2>
<p>自定义调试宏，快速切换调试模式：</p>
<pre><code>#define DEBUG_NORMAL 1

fixed4 frag (v2f i) : SV_Target {
    #if DEBUG_NORMAL
        return fixed4(i.normal * 0.5 + 0.5, 1);
    #else
        // 正式代码
    #endif
}</code></pre>
<h2>3. ​<strong>版本兼容性声明</strong></h2>
<p>在Shader开头明确声明目标级别：</p>
<pre><code>#pragma target 3.5
#pragma require tessellation</code></pre>
<hr />
<h1>​<strong>五、调试思维</strong></h1>
<ol>
<li>​<strong>最小化复现</strong>：将Shader简化到仅保留问题的最小代码块</li>
<li>​<strong>对比法</strong>：与官方Standard Shader或已知正常Shader对比输入输出</li>
<li>​<strong>边界值测试</strong>：测试UV(0,0)、(1,1)、法线(0,0,1)等极端情况</li>
<li>​<strong>物理合理性检查</strong>：高光是否能量守恒？光照衰减是否符合预期？</li>
</ol>
<hr />
<p>可能用到的工具清单</p>
<ul>
<li><a title="VSCode Shaderlab插件" href="https://marketplace.visualstudio.com/items?itemName=amlovey.shaderlabvscodefree" target="_blank">VSCode Shaderlab</a>插件：支持语法高亮和自动补全</li>
<li><a title="Unity Graphics Test Framework" href="https://docs.unity3d.com/Packages/com.unity.test-framework@1.1/manual/reference-attribute-unitytest.html" target="_blank">Unity Graphics Test Framework</a>：自动化测试Shader表现</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.caiyanpei.com/unity_shader_debug_check/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unity Shader优化策略：提升性能与效果的关键</title>
		<link>http://www.caiyanpei.com/unity-shader-optimized/</link>
		<comments>http://www.caiyanpei.com/unity-shader-optimized/#comments</comments>
		<pubDate>Sat, 12 Nov 2022 13:25:40 +0000</pubDate>
		<dc:creator>tsai</dc:creator>
				<category><![CDATA[Unity]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[shader]]></category>
		<category><![CDATA[unity]]></category>
		<category><![CDATA[优化]]></category>

		<guid isPermaLink="false">http://www.caiyanpei.com/?p=647</guid>
		<description><![CDATA[在Unity开发中，Shader是渲染效果的核心，但复杂的Shader往往会带来 &#8230; <a href="http://www.caiyanpei.com/unity-shader-optimized/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>在Unity开发中，Shader是渲染效果的核心，但复杂的Shader往往会带来性能问题。为了在保证视觉效果的同时提升性能，Shader优化成为了我们平常必须要理解应用的一环。本文主要探讨Unity中Shader优化的策略。</p>
<hr />
<h1>一、Shader优化的重要性</h1>
<p>Shader是GPU执行的程序，负责计算每个像素的颜色和光照效果。复杂的Shader会导致以下问题：</p>
<ul>
<li>​<strong>GPU负载过高</strong>：帧率下降，游戏卡顿。</li>
<li>​<strong>发热和耗电</strong>：移动设备性能瓶颈。</li>
<li>​<strong>渲染效率低</strong>：影响整体游戏体验。</li>
</ul>
<p>因此，Shader优化不仅是提升性能的关键，也是保证游戏流畅运行的必要手段。</p>
<hr />
<h1>二、Shader优化的核心策略</h1>
<h2>1. ​<strong>减少计算复杂度</strong></h2>
<ul>
<li>​<strong>避免不必要的计算</strong>：在Shader中只计算真正需要的值。例如，如果不需要法线贴图，就不要计算法线相关的值。</li>
<li>​<strong>简化数学运算</strong>：使用低精度的数据类型（如<code>half</code>代替<code>float</code>），减少复杂的数学运算（如<code>pow</code>、<code>sin</code>、<code>cos</code>等）。</li>
<li>​<strong>分支优化</strong>：尽量避免在Shader中使用<code>if</code>语句，因为GPU对分支处理效率较低。可以使用<code>step</code>或<code>lerp</code>等函数替代。</li>
</ul>
<p>​<strong>示例：​</strong></p>
<pre><code>// 不推荐
if (value &gt; 0.5) {
    color = red;
} else {
    color = blue;
}

// 推荐
color = lerp(blue, red, step(0.5, value));</code></pre>
<h2>2. ​<strong>优化纹理采样</strong></h2>
<ul>
<li>​<strong>减少纹理采样次数</strong>：每次纹理采样都会消耗性能，尽量减少采样次数。例如，将多个纹理合并为一张纹理（纹理图集）。</li>
<li>​<strong>使用Mipmaps</strong>：启用Mipmaps可以减少远处纹理的采样复杂度，提升性能。</li>
<li>​<strong>优化纹理格式</strong>：根据需求选择合适的纹理格式（如ETC2、ASTC），减少显存占用。</li>
</ul>
<p>​<strong>示例：​</strong></p>
<pre><code>// 不推荐
float4 color1 = tex2D(_MainTex, uv1);
float4 color2 = tex2D(_DetailTex, uv2);

// 推荐
float4 color = tex2D(_CombinedTex, uv);</code></pre>
<h2>3. ​<strong>优化光照计算</strong></h2>
<ul>
<li>​<strong>使用简化光照模型</strong>：在移动设备上，可以使用Lambert或Blinn-Phong等简化光照模型，而不是复杂的PBR模型。</li>
<li>​<strong>烘焙光照</strong>：将静态物体的光照信息烘焙到光照贴图中，减少实时计算。</li>
<li>​<strong>减少实时光源</strong>：尽量减少场景中的实时光源数量，使用点光源或聚光灯替代平行光。</li>
</ul>
<p>​<strong>示例：​</strong></p>
<pre><code>// 不推荐（复杂PBR）
float3 brdf = CalculateBRDF(normal, viewDir, lightDir);

// 推荐（简化Blinn-Phong）
float3 diffuse = max(dot(normal, lightDir), 0.0) * _LightColor;
float3 specular = pow(max(dot(reflectDir, viewDir), 0.0), _Gloss) * _SpecularColor;</code></pre>
<h2>4. ​<strong>减少顶点着色器计算</strong></h2>
<ul>
<li>​<strong>将计算移到片段着色器</strong>：如果某些计算在顶点着色器和片段着色器中重复，可以将它们移到片段着色器中，减少顶点着色器的负载。</li>
<li>​<strong>优化顶点数据</strong>：减少顶点数据的数量，例如使用压缩的顶点格式。</li>
</ul>
<p>​<strong>示例：​</strong></p>
<pre><code>// 不推荐（在顶点着色器中计算光照）
v2f vert(appdata v) {
    v2f o;
    o.worldPos = mul(unity_ObjectToWorld, v.vertex);
    o.normal = UnityObjectToWorldNormal(v.normal);
    o.lightDir = normalize(_WorldSpaceLightPos0.xyz - o.worldPos);
    return o;
}

// 推荐（在片段着色器中计算光照）
v2f vert(appdata v) {
    v2f o;
    o.worldPos = mul(unity_ObjectToWorld, v.vertex);
    o.normal = UnityObjectToWorldNormal(v.normal);
    return o;
}</code></pre>
<h2>5. ​<strong>使用Shader变体</strong></h2>
<ul>
<li>​<strong>减少变体数量</strong>：使用<code>#pragma multi_compile</code>或<code>#pragma shader_feature</code>生成多个Shader变体，避免不必要的功能启用。</li>
<li>​<strong>剔除无用变体</strong>：在Shader中根据平台或功能需求，剔除无用的变体。</li>
</ul>
<p>​<strong>示例：​</strong></p>
<pre><code>#pragma multi_compile _ _USE_DETAIL
#ifdef _USE_DETAIL
    float4 detailColor = tex2D(_DetailTex, uv);
    color *= detailColor;
#endif</code></pre>
<h2>6. ​<strong>使用GPU Instancing</strong></h2>
<ul>
<li>​<strong>减少Draw Call</strong>：对于大量相同的物体，使用GPU Instancing可以减少Draw Call，提升性能。</li>
<li>​<strong>优化材质设置</strong>：启用<code>Enable GPU Instancing</code>选项，确保材质支持实例化。</li>
</ul>
<p>​<strong>示例：​</strong></p>
<pre><code>#pragma multi_compile_instancing
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(float4, _Color)
UNITY_INSTANCING_BUFFER_END(Props)</code></pre>
<hr />
<h1>三、工具与调试</h1>
<h2>1. ​<strong>Frame Debugger</strong></h2>
<ul>
<li>使用Unity的Frame Debugger分析每一帧的渲染过程，找出性能瓶颈。</li>
</ul>
<h2>2. ​<strong>Shader性能分析</strong></h2>
<ul>
<li>使用工具（如RenderDoc、Xcode GPU Frame Capture）分析Shader的性能。</li>
</ul>
<h2>3. ​<strong>Profiler</strong></h2>
<ul>
<li>使用Unity Profiler监控GPU和CPU的负载，定位性能问题。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.caiyanpei.com/unity-shader-optimized/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unity中的Shader魔法</title>
		<link>http://www.caiyanpei.com/unity_shader_magic/</link>
		<comments>http://www.caiyanpei.com/unity_shader_magic/#comments</comments>
		<pubDate>Thu, 21 Nov 2019 12:52:13 +0000</pubDate>
		<dc:creator>tsai</dc:creator>
				<category><![CDATA[Unity]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[shader]]></category>
		<category><![CDATA[unity]]></category>

		<guid isPermaLink="false">http://www.caiyanpei.com/?p=644</guid>
		<description><![CDATA[在Unity的世界里，Shader就像是给游戏对象施法的魔杖，它能让平凡的3D模 &#8230; <a href="http://www.caiyanpei.com/unity_shader_magic/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>在Unity的世界里，Shader就像是给游戏对象施法的魔杖，它能让平凡的3D模型焕发出惊人的视觉效果。本文探讨Unity中Shader的奥秘，从基础概念到应用，了解下这门强大的图形编程艺术。</p>
<h1>一、揭开神秘面纱</h1>
<h2>1.1 什么是Shader？</h2>
<p>Shader是运行在GPU上的小程序，专门处理图形渲染的各个阶段。它决定了物体如何被绘制到屏幕上，控制着颜色、光照、纹理等视觉效果。</p>
<h2>1.2 Shader的类型</h2>
<ul>
<li>​<strong>表面着色器（Surface Shader）​</strong>：Unity的高层抽象，适合初学者</li>
<li>​<strong>顶点/片段着色器（Vertex/Fragment Shader）​</strong>：更底层的控制</li>
<li>​<strong>固定函数着色器（Fixed Function Shader）​</strong>：旧式硬件兼容</li>
<li>​<strong>计算着色器（Compute Shader）​</strong>：用于通用计算任务</li>
</ul>
<h1>二、创建第一个Shader</h1>
<h2>2.1 使用Shader Graph</h2>
<p>Unity的Shader Graph是可视化Shader编程工具，适合美术和程序员协作：</p>
<ol>
<li>创建Shader Graph资源</li>
<li>添加主纹理节点</li>
<li>连接颜色输出</li>
<li>调整光照模型</li>
<li>生成最终Shader</li>
</ol>
<h2>2.2 手撸Shader代码</h2>
<p>对于更高级的控制，可以直接编写Shader代码：</p>
<pre><code>Shader "Custom/SimpleDiffuse" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
        }
        ENDCG
    }
    FallBack "Diffuse"
}</code></pre>
<h1>三、Shader进一步</h1>
<h2>3.1 实现卡通渲染（Toon Shading）</h2>
<ul>
<li>使用法线贴图增强细节</li>
<li>实现边缘检测（Edge Detection）</li>
<li>创建颜色分级（Color Ramp）</li>
</ul>
<pre><code>Shader "Toon/Basic" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _Ramp ("Ramp Texture", 2D) = "white" {}
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Toon

        // 实现Toon光照模型
        // 使用Ramp纹理进行颜色分级
        ENDCG
    }
    FallBack "Diffuse"
}</code></pre>
<h2>3.2 创建水效果Shader</h2>
<ul>
<li>使用法线贴图模拟水面波纹</li>
<li>实现折射和反射效果</li>
<li>添加深度效果（Depth Fade）</li>
</ul>
<pre><code>Shader "Water/Basic" {
    Properties {
        _MainTex ("Wave Texture", 2D) = "white" {}
        _BumpMap ("Normal Map", 2D) = "bump" {}
        _ReflectionTex ("Reflection", 2D) = "white" {}
    }
    SubShader {
        Tags { "RenderType"="Transparent" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Water

        // 实现水特效
        // 处理折射、反射
        // 添加动画效果
        ENDCG
    }
    FallBack "Transparent/Diffuse"
}</code></pre>
<h1>四、Shader优化策略</h1>
<ol>
<li>​<strong>减少纹理采样</strong>：合并纹理或使用纹理图集</li>
<li>​<strong>优化数学运算</strong>：使用低精度数据类型</li>
<li>​<strong>减少分支语句</strong>：尽量避免if-else语句</li>
<li>​<strong>利用GPU并行性</strong>：设计适合并行计算的结构</li>
<li>​<strong>使用Shader变体</strong>：针对不同情况生成优化版本</li>
</ol>
<h1>五、Shader调试</h1>
<ol>
<li>​<strong>使用Frame Debugger</strong>：逐步分析渲染过程</li>
<li>​<strong>添加调试输出</strong>：返回特定颜色值检查中间结果</li>
<li>​<strong>使用Profiler</strong>：分析Shader性能瓶颈</li>
<li>​<strong>Shader错误日志</strong>：检查编译错误和警告</li>
<li>​<strong>可视化工具</strong>：如AMD GPU PerfStudio</li>
</ol>
<h1>六、现代渲染管线</h1>
<h2>6.1 通用渲染管线（URP）</h2>
<ul>
<li>轻量级、高性能</li>
<li>适合移动平台和VR</li>
<li>支持Shader Graph</li>
</ul>
<h2>6.2 高清渲染管线（HDRP）</h2>
<ul>
<li>高质量、高保真</li>
<li>适合PC和主机平台</li>
<li>先进的物理效果</li>
</ul>
<h1>七、实现昼夜循环Shader</h1>
<ol>
<li>创建天空盒材质</li>
<li>编写Shader控制太阳位置</li>
<li>实现光照渐变</li>
<li>添加星星和月亮效果</li>
<li>控制云层运动</li>
</ol>
<pre><code>Shader "Skybox/Procedural" {
    Properties {
        _SunColor ("Sun Color", Color) = (1,1,1,1)
        _HorizonColor ("Horizon Color", Color) = (0.5,0.5,0.5,1)
        // 其他属性...
    }
    SubShader {
        Tags { "Queue"="Background" "RenderType"="Background" }
        LOD 100

        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // 实现昼夜循环逻辑
            ENDCG
        }
    }
}</code></pre>
<h1>结语</h1>
<p>Shader编程是Unity开发中很有创造性和挑战性的领域之一。通过掌握Shader技术，以为游戏带来令人惊叹的视觉效果。优秀的Shader不仅需要技术功底，更需要艺术眼光和创造力。从简单的漫反射到复杂的水面效果，每一步都是对图形编程艺术的探索。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caiyanpei.com/unity_shader_magic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
