Search Unity

too many texture interpolaters would be used....(with shader model 4.0)

Discussion in 'Shaders' started by keeperkai2, Jun 26, 2013.

  1. keeperkai2

    keeperkai2

    Joined:
    Oct 26, 2012
    Posts:
    14
    I've been developing some shaders(well, actually a program that can modify shaders into what you see in the picture below) that could melt away some parts(in real-time) in the scene:
    $meltshader.jpg
    The logic behind the shader is that it generates some value and if the value is lower than some threshold, the pixel is clipped, otherwise the shader outputs the original color of the original shader(which are unity built-in shaders).

    The problem is, sometime's the shader will need a few more texture interpolaters for the calculations for the melting. And my calculations actually only requires one texture interpolater. But for some shaders such as "Reflective/Parallax Diffuse", even one more is too much. By searching on the internet I found out that shader model 4.0 shaders can support 16 interpolaters, and in the compiled source code of Reflective/Parallax Diffuse(which I got from using #pragma debug):
    Code (csharp):
    1. #ifdef LIGHTMAP_OFF
    2. struct v2f_surf {
    3.   float4 pos : SV_POSITION;
    4.   float4 pack0 : TEXCOORD0;
    5.   float3 viewDir : TEXCOORD1;
    6.   fixed4 TtoW0 : TEXCOORD2;
    7.   fixed4 TtoW1 : TEXCOORD3;
    8.   fixed4 TtoW2 : TEXCOORD4;
    9.   fixed3 lightDir : TEXCOORD5;
    10.   fixed3 vlight : TEXCOORD6;
    11.   LIGHTING_COORDS(7,8)
    12. };
    13. #endif
    14. #ifndef LIGHTMAP_OFF
    15. struct v2f_surf {
    16.   float4 pos : SV_POSITION;
    17.   float4 pack0 : TEXCOORD0;
    18.   float3 viewDir : TEXCOORD1;
    19.   fixed4 TtoW0 : TEXCOORD2;
    20.   fixed4 TtoW1 : TEXCOORD3;
    21.   fixed4 TtoW2 : TEXCOORD4;
    22.   float2 lmap : TEXCOORD5;
    23.   LIGHTING_COORDS(6,7)
    24. };
    which means the shader uses at most 9 interpolaters before my modifications were applied, I only need the worldPos(world space position of the fragment), so in the surface shader I add "float3 worldPos" to the Input struct, so the modified shader should only need 10 interpolaters(which means I should be fine even with shader model 3.0), but even if I add "#pragma target 4.0" to the modified shader(which should allow 16 interpolaters), unity still tells me "too many interpolaters would be used", well my graphics card is ati HD 7770(which should support up to shader model 5.0) so I don't understand what's wrong here.
    any ideas?


    2013/7/4
    I sent this problem to unity through the bug reporter in the editor, they replied that they were able to reproduce the problem but can't promise when they will fix this in the future so...XD
     
    Last edited: Jul 3, 2013