GPU Animation Factory (UPDATE: Added texture rotate, auto-rotate clockwise/counter-clockwise)

@mifth said:
@t0neg0d your shader is added to shaderBlow! Thanks a lot!


Awesome... I'm a total tool when it comes to development. I do it for fun, but the finer details of making thing readily available to others is a bit beyond me atm. :(
@t0neg0d said:
Awesome... I'm a total tool when it comes to development. I do it for fun, but the finer details of making thing readily available to others is a bit beyond me atm. :(

That is why there also is a contribution repository like normen talks about. Please use it. The "official" jME contribution repository will make it easier to find and for more people to help maintain the code.
mifth do a good job with the shaderBlow and related stuff but I think it has a little bit different role than the contribution repository.
1 Like

I’ll move shaderBlow into the official JME Contribution repository soon…

3 Likes

i would love to get exactly the same water effect :smiley:

mifth said:
I'll move shaderBlow into the official JME Contribution repository soon..

The best of both worlds :)

Hi you all,
I recently tried this amaizing shader that you have contributed to the community.
First I would like to say thanks 1 Million for this. It really makes a big difference in my games look.
Second, I got a problem running this shader on my Android device. I get a cast error, is there any one that knows where this bug lies?

[java]W/dalvikvm(22592): threadid=11: thread exiting with uncaught exception (group=0x40c301f8)
E/AndroidHarness(22592): Exception thrown in Thread[GLThread 1049,5,main]
E/AndroidHarness(22592): com.jme3.renderer.RendererException: compile error in:ShaderSource[name=Shaders/GPUAnimationFactory.vert, defines, type=Vertex, language=GLSL100] error:(912) : error C7011: implicit cast from “int” to “mediump float”
E/AndroidHarness(22592): (913) : error C7011: implicit cast from “int” to “mediump float”
E/AndroidHarness(22592):
E/AndroidHarness(22592): at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderSourceData(OGLESShaderRenderer.java:818)
E/AndroidHarness(22592): at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderData(OGLESShaderRenderer.java:842)
E/AndroidHarness(22592): at com.jme3.renderer.android.OGLESShaderRenderer.setShader(OGLESShaderRenderer.java:893)
E/AndroidHarness(22592): at com.jme3.material.Material.renderMultipassLighting(Material.java:835)
E/AndroidHarness(22592): at com.jme3.material.Material.render(Material.java:1055)
E/AndroidHarness(22592): at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:523)
E/AndroidHarness(22592): at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:322)
E/AndroidHarness(22592): at com.jme3.renderer.queue.RenderQueue.renderQueue(RenderQueue.java:374)
E/AndroidHarness(22592): at com.jme3.renderer.RenderManager.renderViewPortQueues(RenderManager.java:763)
E/AndroidHarness(22592): at com.jme3.renderer.RenderManager.flushQueue(RenderManager.java:719)
E/AndroidHarness(22592): at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:983)
E/AndroidHarness(22592): at com.jme3.renderer.RenderManager.render(RenderManager.java:1029)
E/AndroidHarness(22592): at com.jme3.app.SimpleApplication.update(SimpleApplication.java:252)
E/AndroidHarness(22592): at com.jme3.app.AndroidHarness.update(AndroidHarness.java:493)
E/AndroidHarness(22592): at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:333)
E/AndroidHarness(22592): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1467)
E/AndroidHarness(22592): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1221)
W/PowerManagerService( 189): Timer 0x7->0x3|0x0
[/java]

I guess those lines (near the end of the shader file).
[java]
animTexCoord1.x += (timesin((m_MoveF_Rotation(pi/180))));
animTexCoord1.y += (timecos((m_MoveF_Rotation(pi/180))));
[/java]
should be 180.0 instead of 180.

I have fixed it in the shaderblow repo.
http://code.google.com/p/jmonkeyplatform-contributions/source/detail?r=852

I also fixed fragment shader.
You cannot reassign varying in fragment shader like this:
[java]
varying vec2 animTexCoord1;

animTexCoord1 += deformFRipple(animTexCoord2); // Crash!

/// YOU SHOULD DO IT LIKE THAT
vec2 coordChanged;
coordChanged = animTexCoord1 + deformFRipple(animTexCoord2); // OK!
[/java]

Sorry, forgot to fix normalmapping.
Fixed: http://code.google.com/p/jmonkeyplatform-contributions/source/detail?r=853

Thanks a million.
I will test this as soon as possible.

Okay, now I get a different error:
[java]W/dalvikvm(24885): threadid=11: thread exiting with uncaught exception (group=0x40c301f8)
E/AndroidHarness(24885): Exception thrown in Thread[GLThread 1331,5,main]
E/AndroidHarness(24885): com.jme3.renderer.RendererException: compile error in:ShaderSource[name=Shaders/GPUAnimationFactory.vert, defines, type=Vertex, language=GLSL100] error:(120) : error C5041: cannot locate suitable resource to bind parameter “vViewDir”
E/AndroidHarness(24885): (121) : error C5041: cannot locate suitable resource to bind parameter “vLightDir”
E/AndroidHarness(24885): 918 lines, 2 errors.
E/AndroidHarness(24885):
E/AndroidHarness(24885): at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderSourceData(OGLESShaderRenderer.java:818)
E/AndroidHarness(24885): at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderData(OGLESShaderRenderer.java:842)
E/AndroidHarness(24885): at com.jme3.renderer.android.OGLESShaderRenderer.setShader(OGLESShaderRenderer.java:893)
E/AndroidHarness(24885): at com.jme3.material.Material.renderMultipassLighting(Material.java:835)
E/AndroidHarness(24885): at com.jme3.material.Material.render(Material.java:1055)
E/AndroidHarness(24885): at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:523)
E/AndroidHarness(24885): at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:322)
E/AndroidHarness(24885): at com.jme3.renderer.queue.RenderQueue.renderQueue(RenderQueue.java:374)
E/AndroidHarness(24885): at com.jme3.renderer.RenderManager.renderViewPortQueues(RenderManager.java:763)
E/AndroidHarness(24885): at com.jme3.renderer.RenderManager.flushQueue(RenderManager.java:719)
E/AndroidHarness(24885): at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:983)
E/AndroidHarness(24885): at com.jme3.renderer.RenderManager.render(RenderManager.java:1029)
E/AndroidHarness(24885): at com.jme3.app.SimpleApplication.update(SimpleApplication.java:252)
E/AndroidHarness(24885): at com.jme3.app.AndroidHarness.update(AndroidHarness.java:493)
E/AndroidHarness(24885): at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:333)
E/AndroidHarness(24885): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1467)
E/AndroidHarness(24885): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1221)[/java]

@ndebruyn said: Thanks a million. I will test this as soon as possible.

Sorry, new fix again.
http://code.google.com/p/jmonkeyplatform-contributions/source/detail?r=854

If I switch VertexLighting on then it works.
I think there is just a small little bug in the VertexLighting setup.

The same error still exist. Seems to be in the vertex shader not the frag shader.

@ndebruyn said: The same error still exist. Seems to be in the vertex shader not the frag shader.

Can you send full log? There also should be posted vertex shader when exception is generated.
Just post it here: http://pastebin.com/

Here is the full trace:
[java]D/dalvikvm(27170): GC_CONCURRENT freed 6276K, 25% free 29705K/39303K, paused 2ms+18ms
D/dalvikvm(27170): GC_CONCURRENT freed 9897K, 37% free 24928K/39303K, paused 3ms+23ms
W/OGLESShaderRenderer(27170): WARNING OGLESShaderRenderer 2:31:44 PM Bad compile of:
W/OGLESShaderRenderer(27170): 1 m_SeparateTexCoord
W/OGLESShaderRenderer(27170): 2 #define DEFORMY_RIPPLE 1
W/OGLESShaderRenderer(27170): 3 #define DIFFUSEMAP 1
W/OGLESShaderRenderer(27170): 4 #define IS_MOVING 1
W/OGLESShaderRenderer(27170): 5 #define USE_ANIMATION 1
W/OGLESShaderRenderer(27170): 6 #define USE_DEFORM 1
W/OGLESShaderRenderer(27170): 7 #define USE_FWAVE 1
W/OGLESShaderRenderer(27170): 8 #define ATTENUATION
W/OGLESShaderRenderer(27170): 9 //#define HQ_ATTENUATION
W/OGLESShaderRenderer(27170): 10
W/OGLESShaderRenderer(27170): 11 uniform mat4 g_WorldViewProjectionMatrix;
W/OGLESShaderRenderer(27170): 12 uniform mat4 g_WorldViewMatrix;
W/OGLESShaderRenderer(27170): 13 uniform mat3 g_NormalMatrix;
W/OGLESShaderRenderer(27170): 14 uniform float g_Time;
W/OGLESShaderRenderer(27170): 15
W/OGLESShaderRenderer(27170): 16 attribute vec3 inPosition;
W/OGLESShaderRenderer(27170): 17 attribute vec2 inTexCoord;
W/OGLESShaderRenderer(27170): 18 attribute vec3 inNormal;
W/OGLESShaderRenderer(27170): 19 varying vec2 texCoord;
W/OGLESShaderRenderer(27170): 20
W/OGLESShaderRenderer(27170): 21 const float pi = 3.14159;
W/OGLESShaderRenderer(27170): 22 varying vec2 animTexCoord1;
W/OGLESShaderRenderer(27170): 23 varying vec2 animTexCoord2;
W/OGLESShaderRenderer(27170): 24
W/OGLESShaderRenderer(27170): 25 #ifdef IS_MOVING
W/OGLESShaderRenderer(27170): 26 uniform float m_MoveF_Speed;
W/OGLESShaderRenderer(27170): 27 uniform float m_MoveF_Rotation;
W/OGLESShaderRenderer(27170): 28 #endif
W/OGLESShaderRenderer(27170): 29
W/OGLESShaderRenderer(27170): 30 uniform bool m_RotF_Rotate;
W/OGLESShaderRenderer(27170): 31 uniform bool m_RotF_AutoRotate;
W/OGLESShaderRenderer(27170): 32 uniform bool m_RotF_Clockwise;
W/OGLESShaderRenderer(27170): 33 uniform float m_RotF_Speed;
W/OGLESShaderRenderer(27170): 34 uniform float m_RotF_Angle;
W/OGLESShaderRenderer(27170): 35
W/OGLESShaderRenderer(27170): 36 #define ATTENUATION
W/OGLESShaderRenderer(27170): 37
W/OGLESShaderRenderer(27170): 38 #if defined(DEFORMX_WAVE) || defined(DEFORMY_WAVE) || defined(DEFORMZ_WAVE)
W/OGLESShaderRenderer(27170): 39 #define HAS_DEFORMWAVE
W/OGLESShaderRenderer(27170): 40 #endif
W/OGLESShaderRenderer(27170): 41 #if defined(DEFORMX_RIPPLE) || defined(DEFORMY_RIPPLE) || defined(DEFORMZ_RIPPLE)
W/OGLESShaderRenderer(27170): 42 #define HAS_DEFORMRIPPLE
W/OGLESShaderRenderer(27170): 43 #endif
W/OGLESShaderRenderer(27170): 44 #if defined(DEFORMX_SWELL) || defined(DEFORMY_SWELL) || defined(DEFORMZ_SWELL)
W/OGLESShaderRenderer(27170): 45 #define HAS_DEFORMSWELL
W/OGLESShaderRenderer(27170): 46 #endif
W/OGLESShaderRenderer(27170): 47 #if defined(DEFORMX_PULSE) || defined(DEFORMY_PULSE) || defined(DEFORMZ_PULSE)
W/OGLESShaderRenderer(27170): 48 #define HAS_DEFORMPULSE
W/OGLESShaderRenderer(27170): 49 #endif
W/OGLESShaderRenderer(27170): 50 #if defined(DEFORMX_WARBLE) || defined(DEFORMY_WARBLE) || defined(DEFORMZ_WARBLE)
W/OGLESShaderRenderer(27170): 51 #define HAS_DEFORMWARBLE
W/OGLESShaderRenderer(27170): 52 #endif
W/OGLESShaderRenderer(27170): 53 #if defined(DEFORMX_WATER) || defined(DEFORMY_WATER) || defined(DEFORMZ_WATER)
W/OGLESShaderRenderer(27170): 54 #define HAS_DEFORMWATER
W/OGLESShaderRenderer(27170): 55 #endif
W/OGLESShaderRenderer(27170): 56
W/OGLESShaderRenderer(27170): 57 uniform vec4 m_FogColor;
W/OGLESShaderRenderer(27170): 58 uniform float m_FogDensity;
W/OGLESShaderRenderer(27170): 59 uniform float m_FogDistance;
W/OGLESShaderRenderer(27170): 60 varying float fog_z;
W/OGLESShaderRenderer(27170): 61
W/OGLESShaderRenderer(27170): 62 uniform float m_SpeedX;
W/OGLESShaderRenderer(27170): 63 uniform float m_SizeX;
W/OGLESShaderRenderer(27170): 64 uniform float m_DepthX;
W/OGLESShaderRenderer(27170): 65 uniform int m_DirX;
W/OGLESShaderRenderer(27170): 66 uniform bool m_MirrorX;
W/OGLESShaderRenderer(27170): 67 uniform float m_RotationX;
W/OGLESShaderRenderer(27170): 68 uniform float m_Offset1X;
W/OGLESShaderRenderer(27170): 69 uniform float m_Offset2X;
W/OGLESShaderRenderer(27170): 70
W/OGLESShaderRenderer(27170): 71 uniform float m_SpeedY;
W/OGLESShaderRenderer(27170): 72 uniform float m_SizeY;
W/OGLESShaderRenderer(27170): 73 uniform float m_DepthY;
W/OGLESShaderRenderer(27170): 74 uniform int m_DirY;
W/OGLESShaderRenderer(27170): 75 uniform bool m_MirrorY;
W/OGLESShaderRenderer(27170): 76 uniform float m_RotationY;
W/OGLESShaderRenderer(27170): 77 uniform float m_Offset1Y;
W/OGLESShaderRenderer(27170): 78 uniform float m_Offset2Y;
W/OGLESShaderRenderer(27170): 79
W/OGLESShaderRenderer(27170): 80 uniform float m_SpeedZ;
W/OGLESShaderRenderer(27170): 81 uniform float m_SizeZ;
W/OGLESShaderRenderer(27170): 82 uniform float m_DepthZ;
W/OGLESShaderRenderer(27170): 83 uniform int m_DirZ;
W/OGLESShaderRenderer(27170): 84 uniform bool m_MirrorZ;
W/OGLESShaderRenderer(27170): 85 uniform float m_RotationZ;
W/OGLESShaderRenderer(27170): 86 uniform float m_Offset1Z;
W/OGLESShaderRenderer(27170): 87 uniform float m_Offset2Z;
W/OGLESShaderRenderer(27170): 88
W/OGLESShaderRenderer(27170): 89 //varying vec3 vNormal;
W/OGLESShaderRenderer(27170): 90 varying vec4 vVertex;
W/OGLESShaderRenderer(27170): 91 varying vec3 vPosition;
W/OGLESShaderRenderer(27170): 92
W/OGLESShaderRenderer(27170): 93 uniform mat4 g_ViewMatrix;
W/OGLESShaderRenderer(27170): 94
W/OGLESShaderRenderer(27170): 95 uniform vec4 m_Ambient;
W/OGLESShaderRenderer(27170): 96 uniform vec4 m_Diffuse;
W/OGLESShaderRenderer(27170): 97 uniform vec4 m_Specular;
W/OGLESShaderRenderer(27170): 98 uniform float m_Shininess;
W/OGLESShaderRenderer(27170): 99
W/OGLESShaderRenderer(27170): 100 uniform vec4 g_LightColor;
W/OGLESShaderRenderer(27170): 101 uniform vec4 g_LightPosition;
W/OGLESShaderRenderer(27170): 102 uniform vec4 g_AmbientLightColor;
W/OGLESShaderRenderer(27170): 103
W/OGLESShaderRenderer(27170): 104 #ifdef SEPARATE_TEXCOORD
W/OGLESShaderRenderer(27170): 105 varying vec2 texCoord2;
W/OGLESShaderRenderer(27170): 106 attribute vec2 inTexCoord2;
W/OGLESShaderRenderer(27170): 107 #endif
W/OGLESShaderRenderer(27170): 108
W/OGLESShaderRenderer(27170): 109 varying vec3 AmbientSum;
W/OGLESShaderRenderer(27170): 110 varying vec4 DiffuseSum;
W/OGLESShaderRenderer(27170): 111 varying vec3 SpecularSum;
W/OGLESShaderRenderer(27170): 112
W/OGLESShaderRenderer(27170): 113 varying vec3 lightVec;
W/OGLESShaderRenderer(27170): 114 //varying vec4 spotVec;
W/OGLESShaderRenderer(27170): 115
W/OGLESShaderRenderer(27170): 116 #ifdef VERTEX_COLOR
W/OGLESShaderRenderer(27170): 117 attribute vec4 inColor;
W/OGLESShaderRenderer(27170): 118 #endif
W/OGLESShaderRenderer(27170): 119
W/OGLESShaderRenderer(27170): 120 varying vec3 vNormal;
W/OGLESShaderRenderer(27170): 121
W/OGLESShaderRenderer(27170): 122 #ifndef VERTEX_LIGHTING
W/OGLESShaderRenderer(27170): 123 attribute vec4 inTangent;
W/OGLESShaderRenderer(27170): 124
W/OGLESShaderRenderer(27170): 125 #ifndef NORMALMAP
W/OGLESShaderRenderer(27170): 126 // varying vec3 vNormal;
W/OGLESShaderRenderer(27170): 127 #endif
W/OGLESShaderRenderer(27170): 128 //varying vec3 vPosition;
W/OGLESShaderRenderer(27170): 129 varying vec3 vViewDir;
W/OGLESShaderRenderer(27170): 130 varying vec4 vLightDir;
W/OGLESShaderRenderer(27170): 131 #else
W/OGLESShaderRenderer(27170): 132 varying vec2 vertexLightValues;
W/OGLESShaderRenderer(27170): 133 uniform vec4 g_LightDirection;
W/OGLESShaderRenderer(27170): 134 #endif
W/OGLESShaderRenderer(27170): 135
W/OGLESShaderRenderer(27170): 136 #ifdef USE_REFLECTION
W/OGLESShaderRenderer(27170): 137 uniform vec3 g_CameraPosition;
W/OGLESShaderRenderer(27170): 138 uniform mat4 g_WorldMatrix;
W/OGLESShaderRenderer(27170): 139
W/OGLESShaderRenderer(27170): 140 uniform vec3 m_FresnelParams;
W/OGLESShaderRenderer(27170): 141 varying vec4 refVec;
W/OGLESShaderRenderer(27170): 142
W/OGLESShaderRenderer(27170): 143
W/OGLESShaderRenderer(27170): 144 /**
W/OGLESShaderRenderer(27170): 145 * Input:
W/OGLESShaderRenderer(27170): 146 * attribute inPosition
W/OGLESShaderRenderer(27170): 147 * attribute inNormal
W/OGLESShaderRenderer(27170): 148 * uniform g_WorldMatrix
W/OGLESShaderRenderer(27170): 149 * uniform g_CameraPosition
W/OGLESShaderRenderer(27170): 150 *
W/OGLESShaderRenderer(27170): 151 * Output:
W/OGLESShaderRenderer(27170): 152 * varying refVec
W/OGLESShaderRenderer(27170): 153 */
W/OGLESShaderRenderer(27170): 154 void computeRef(){
W/OGLESShaderRenderer(27170): 155 vec3 worldPos = (g_WorldMatrix * vec4(inPosition,1.0)).xyz;
W/OGLESShaderRenderer(27170): 156
W/OGLESShaderRenderer(27170): 157 vec3 I = no
W/dalvikvm(27170): threadid=11: thread exiting with uncaught exception (group=0x40c301f8)
E/AndroidHarness(27170): Exception thrown in Thread[GLThread 1568,5,main]
E/AndroidHarness(27170): com.jme3.renderer.RendererException: compile error in:ShaderSource[name=Shaders/GPUAnimationFactory.vert, defines, type=Vertex, language=GLSL100] error:(129) : error C5041: cannot locate suitable resource to bind parameter “vViewDir”
E/AndroidHarness(27170): (130) : error C5041: cannot locate suitable resource to bind parameter “vLightDir”
E/AndroidHarness(27170): 927 lines, 2 errors.
E/AndroidHarness(27170):
E/AndroidHarness(27170): at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderSourceData(OGLESShaderRenderer.java:818)
E/AndroidHarness(27170): at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderData(OGLESShaderRenderer.java:842)
E/AndroidHarness(27170): at com.jme3.renderer.android.OGLESShaderRenderer.setShader(OGLESShaderRenderer.java:893)
E/AndroidHarness(27170): at com.jme3.material.Material.renderMultipassLighting(Material.java:835)
E/AndroidHarness(27170): at com.jme3.material.Material.render(Material.java:1055)
E/AndroidHarness(27170): at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:523)
E/AndroidHarness(27170): at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:322)
E/AndroidHarness(27170): at com.jme3.renderer.queue.RenderQueue.renderQueue(RenderQueue.java:380)
E/AndroidHarness(27170): at com.jme3.renderer.RenderManager.renderViewPortQueues(RenderManager.java:782)
E/AndroidHarness(27170): at com.jme3.renderer.RenderManager.flushQueue(RenderManager.java:719)
E/AndroidHarness(27170): at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:983)
E/AndroidHarness(27170): at com.jme3.renderer.RenderManager.render(RenderManager.java:1029)
E/AndroidHarness(27170): at com.jme3.app.SimpleApplication.update(SimpleApplication.java:252)
E/AndroidHarness(27170): at com.jme3.app.AndroidHarness.update(AndroidHarness.java:493)
E/AndroidHarness(27170): at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:333)
E/AndroidHarness(27170): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1467)
E/AndroidHarness(27170): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1221)
D/dalvikvm(27170): GC_CONCURRENT freed 6238K, 40% free 23767K/39303K, paused 3ms+18ms[/java]

@ndebruyn said: .....

Aha, this is different log. There are no bugs.
“cannot locate suitable resource to bind parameter” - this is limitation of your mobile video card.

Explanation:
Video card has 20 uniforms/varyings, for example. But the shader is very complex and it has 25 uniforms/varyings, for example.
So, the video card cannot locate 5 uniforms. That’s my explanention.

This shader is good for desktops.
You also can optimize it if you want and remove some varyings/uniforms. For example you can remove:

  • shadows
  • lighting
  • specular
  • Normalmaps and Parallax maps.
    And you will get a model with deformation texture.

Aaa, than you so much. I will lool into it.

Would it be possible for you to help me do this?
I actually only need the wave and ripple effect.
I will have a go at it but I might struggle because I don’t really know too much about shaders.

Yes, i will help.

Let’s call your new shader like “GPUAnimationFactoryUnshaded”. It will have only diffuse texture and animation of texCoord.
I can also add you as a Committer to my local shader repository: http://code.google.com/p/jme-glsl-shaders/
just send me your email if you want. Or you can post your code here.