HI guys,
i have little problem with converting an old unity 2.6 d3d9 shader to unity 3 gles.
I can’t finde the right equivalent for the modulo function mod(x,y).
I tried %, modf(x,y), x mod y.
my includs are
CGPROGRAM
// Upgrade NOTE: excluded shader from Xbox360; has structs without semantics (struct v2f members uv,uv2)
#pragma exclude_renderers xbox360
#pragma only_renderers gles
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_builtin
#pragma fragmentoption ARB_fog_exp2
#pragma fragmentoption ARB_precision_hint_fastest
#include “UnityCG.cginc”
#include “AutoLight.cginc”
Does anyone know the right one?
Thanks for your help and clues.
Hi, DomBomDom,
the piece of code that you provided is not for GLSL, it is for a CG shader.
take a look at this page: http://unity3d.com/support/documentation/Manual/Shaders.html
and here you can find the function you need: http://http.developer.nvidia.com/CgTutorial/cg_tutorial_appendix_e.html
Hope this helps.
Thanks a lot.
it’s fmod(x,y).
I know that is it a CG shader. But Unity usually ports it to GLSL. Using fmod works fine. Don’t know why it worked with mod before.
By the way i reworte the shader to GLSL manually. I am looking forward to see the perfomrance differences on an i device. Don’t have one here right now. I’ll post it later.
Thanks again…
1 Like
DomBomDom, PM me or write here, about your test results on iDevice. i’m very interested in this.
Thanks.
I too was attempting to convert a GLSL shader to CG. The original shader had a loop that iterated 255 times.
I got an error that said I had exceeded the number of registers allowed (32). When I changed the loop to iterate fewer times the error went away.
Is this a bug in the optimization code?
I looked at the compiled version and it had:
while (true) {
if ((i_1 >= 24)) {
break;
};
vec2 tmpvar_31;
tmpvar_31.x = (vec2(((z.x * z.x) - (z.y * z.y)))).x;
tmpvar_31.y = (vec2(((2.0 * z.x) * z.y))).y;
vec2 tmpvar_32;
tmpvar_32 = (cc + tmpvar_31);
z = tmpvar_32;
float tmpvar_33;
tmpvar_33 = dot (tmpvar_32, tmpvar_32);
m2 = tmpvar_33;
if ((tmpvar_33 > 1024.0)) {
break;
};
co = (co + 1.0);
i_1 = (i_1 + 1);
};
The test for i_1 >= 24 being the change I had to make in order for it to compile.
So… I copied the compiled version and created a new shader, pasting into my text editor the compiled version
with the 24 changed to 256 and it let me do that, no errors.
Strange workaround.