我正在尝试制作全屏自定义后期效果。将脚本添加到主凸轮,使用一行:void OnRenderImage(src,dst)中的blit(src,dst,mat)。我用_MainTex写了着色器,所以它可以在“Blit”中工作。我做了(很多次)所有正确的就像在tuts。如果我将此着色器分配给任何对象(带纹理)它运行良好,但问题是当我将该着色器(在材质中)分配给脚本(blit(,, mat))时它忽略了ddx,ddy部分,它的工作原理就像tex2D(TEX,UV)。为什么?我该怎么解决?这是片段代码。
fixed3 frag(vout v):sv_target
{
fixed3 c;
float2 cddx=float2(
pow(abs(0.5-v.uv.x),1.6)*_xy,
-pow(abs(0.5-v.uv.y),1.6)*_xy);
float2 cddy=float2(
-pow(abs(0.5-v.uv.x),1.6)*_xy,
pow(abs(0.5-v.uv.y),1.6)*_xy);
c=tex2D(_MainTex,v.uv,cddx,cddy);
return c*0.5;
}
我找到了答案。 tex2D(sampler2D,uv,ddx,ddy)和tex2Dgrad(...)方法使用mipmap。当我试图将“屏幕”纹理传递给blit(src,dst,mat)中的着色器时,我注意到src没有mipmaps,只有原始纹理。所以,我认为我只需使用src.GenerateMips()添加mipmap即可。但有一个问题:如果我尝试这样做,编辑器会抛出创建rendertexture的异常,生成mips不会在创建的rendertexture和其他东西中运行...最后我找到了recipy:
它会在新的渲染纹理上生成mipmap并将其传递给着色器而不会出现任何错误。
最后一件事,如果有人知道如何指定我想要生成的mipmap计数,请告诉我。
我希望它对像我这样的着色器的新手有所帮助。