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

问题描述 投票:1回答:1

我正在尝试制作全屏自定义后期效果。将脚本添加到主凸轮,使用一行: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;
     }
unity3d shader hlsl effects post-processing
1个回答
1
投票

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

  • 一度 创建另一个临时renderTexture 关闭自动生成mipmap useMips =真
  • 每一帧(OnRenderImage(...)) blit src to temp 在temp中生成mipmap 位块传送(温度,DST,垫)

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.