Is there any efficient way to set texture frames?
Right now it requires manually normalizing the min and max points of a frame to type them in and typing in the time.
Efficient way to set texture frames for a particle effect?
Hi, did you trying doing similar stuff ?
this is from unity example with some fixes.
let’s say
you got this texture:
this shader UnlitAnim
[code]#include “Uniforms.glsl”
#include “Samplers.glsl”
#include “Transform.glsl”
#include “ScreenPos.glsl”
#include “Fog.glsl”
varying vec2 vTexCoord;
varying vec4 vWorldPos;
#ifdef VERTEXCOLOR
varying vec4 vColor;
#endif
#ifdef COMPILEVS
uniform float cAnimTime;
uniform float cAnimTileX;
uniform float cAnimTileY;
void VS()
{
mat4 modelMatrix = iModelMatrix;
vec3 worldPos = GetWorldPos(modelMatrix);
gl_Position = GetClipPos(worldPos);
vTexCoord = GetTexCoord(iTexCoord);
vWorldPos = vec4(worldPos, GetDepth(gl_Position));
int index = int(cAnimTime);
index = index % int(cAnimTileX * cAnimTileY);
vec2 size = vec2(1.0 / float(cAnimTileX), 1.0 / float(cAnimTileY));
// split into horizontal and vertical index
int uIndex = index % int((cAnimTileX));
int vIndex = index / int((cAnimTileY));
vec2 finalFrame = iTexCoord;
finalFrame.x /= cAnimTileX;
finalFrame.y /= cAnimTileY;
finalFrame += vec2((uIndex) * size.x, (vIndex) * size.y);
vTexCoord = GetTexCoord(finalFrame);
#ifdef VERTEXCOLOR
vColor = iColor;
#endif
}
#endif
void PS()
{
// Get material diffuse albedo
#ifdef DIFFMAP
vec4 diffColor = cMatDiffColor * texture2D(sDiffMap, vTexCoord);
#ifdef ALPHAMASK
if (diffColor.a < 0.5)
discard;
#endif
#else
vec4 diffColor = cMatDiffColor;
#endif
#ifdef VERTEXCOLOR
diffColor *= vColor;
#endif
// Get fog factor
#ifdef HEIGHTFOG
float fogFactor = GetHeightFogFactor(vWorldPos.w, vWorldPos.y);
#else
float fogFactor = GetFogFactor(vWorldPos.w);
#endif
#if defined(PREPASS)
// Fill light pre-pass G-Buffer
gl_FragData[0] = vec4(0.5, 0.5, 0.5, 1.0);
gl_FragData[1] = vec4(EncodeDepth(vWorldPos.w), 0.0);
#elif defined(DEFERRED)
gl_FragData[0] = vec4(GetFog(diffColor.rgb, fogFactor), diffColor.a);
gl_FragData[1] = vec4(0.0, 0.0, 0.0, 0.0);
gl_FragData[2] = vec4(0.5, 0.5, 0.5, 1.0);
gl_FragData[3] = vec4(EncodeDepth(vWorldPos.w), 0.0);
#else
gl_FragColor = vec4(GetFog(diffColor.rgb, fogFactor), diffColor.a);
#endif
}[/code]
and this tech for material
<technique vs="UnlitAnim" ps="UnlitAnim" psdefines="DIFFMAP" >
<pass name="base" />
<pass name="prepass" psdefines="PREPASS" />
<pass name="material" />
<pass name="deferred" psdefines="DEFERRED" />
</technique>
create material with this tech and add few uniform for shader (as show on picture bellow)
then try change animTime
Probably you may try use this anim technique for animate particles:
I guess you need put into shader the arrays of uniforms or TBO (with personal particles data - frame(or time)) and fetch it by particle index.
Or just extends(or use free element masks) vertex structure with additional data for each particle(+float time), I guess particles system feed one common VBO for all particles(per emitter) on cpu side every frame.