tex2D(s,t,ddx,ddy)无法在全屏统一工作

时间:2017-12-15 17:48:30

标签: unity3d shader hlsl effects post-processing

我试图制作全屏自定义后期效果。 将脚本添加到主凸轮,使用一行: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;
     }

1 个答案:

答案 0 :(得分:1)

我找到了答案。 tex2D(sampler2D,uv,ddx,ddy)和tex2Dgrad(...)方法使用mipmap。当我试图将“屏幕”纹理传递给blit(src,dst,mat)中的着色器时,我注意到src没有mipmaps,只有原始纹理。所以,我认为我只需使用src.GenerateMips()添加mipmap即可。但是有一个问题:如果我尝试这样做,编辑器会抛出创建rendertexture的异常,生成mips在创建的rendertexture和其他东西中没有输出...最后我找到了收件人:

  • 一次

    1. 创建另一个temp renderTexture
    2. 关闭自动生成mipmap
    3. useMips =真
  • 每一帧(OnRenderImage(...))

    1. blit src to temp
    2. 在temp中生成mipmap
    3. 的blit(温度,DST,垫)

它会在新渲染纹理上生成mipmap并将其传递给着色器而不会出现任何错误。

最后一件事,如果有人知道如何指定我想要生成的mipmap计数,请告诉我。

我希望对像我这样的着色器的新手有所帮助。