Question

J'essaie de faire une impression "Burning Star" sur le jeu Android que j'ai développé avec peu d'aide de la fonction de bruit (bruit simplex dans ce cas). Malheureusement, je ne peux pas utiliser de textures 3D car ils sont dans GLES Extension et Android Packages ne les ont pas inclus.

La seule option qui reste pour moi est donc de calculer la fonction de bruit dans Fragment Shader. Le code fourni ci-dessous s'exécute en douceur ou acceptable (20-60fps) sur HTC Desire Z et Optimus One. Avec le même programme sur Motorola Xoom (qui ont un chipset Tegra2), j'obtiens une fraction (1-3) de FPS même lorsqu'il affiche uniquement une petite partie de l'objet.

Chose que nous avons essayé jusqu'à présent:

  • se mêler de précision (LOWP-HIGP), à la fois dans la directive de première ligne et en spécifiant pour chaque occurrence de flotteur / VEC séparément

  • Commentant des parties de la fonction du bruit - il semble qu'il n'y a pas de goulot d'étranglement particulier, sa combinaison de toutes choses ensemble

  • Problèmes de recherche sur Google liés à Tegra, point flottant dans les shaders, etc.

Ceci est supprimé la partie du code nécessaire à la reproduction de ce comportement. Notez que sur Xoom, il y a des artefacts qui, selon nous, sont causés par des opérations flottantes 16 bits à Tegra.

precision mediump float;
#define pi 3.141592653589793238462643383279     


//
// Description : Array and textureless GLSL 2D/3D/4D simplex
// noise functions.
// Author : Ian McEwan, Ashima Arts.
// Maintainer : ijm
// Lastmod : 20110822 (ijm)
// License : Copyright (C) 2011 Ashima Arts. All rights reserved.
// Distributed under the MIT License. See LICENSE file.
// https://github.com/ashima/webgl-noise
//

vec3 mod289(vec3 x) {
  return x - floor(x * (1.0 / 289.0)) * 289.0;
}

vec4 mod289(vec4 x) {
  return x - floor(x * (1.0 / 289.0)) * 289.0;
}

vec4 permute(vec4 x) {
     return mod289(((x*34.0)+1.0)*x);
}

vec4 taylorInvSqrt(vec4 r)
{
  return 1.79284291400159 - 0.85373472095314 * r;
}

float snoise(vec3 v)
  {
  const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;
  const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);

// First corner
  vec3 i = floor(v + dot(v, C.yyy) );
  vec3 x0 = v - i + dot(i, C.xxx) ;

// Other corners
  vec3 g = step(x0.yzx, x0.xyz);
  vec3 l = 1.0 - g;
  vec3 i1 = min( g.xyz, l.zxy );
  vec3 i2 = max( g.xyz, l.zxy );

  // x0 = x0 - 0.0 + 0.0 * C.xxx;
  // x1 = x0 - i1 + 1.0 * C.xxx;
  // x2 = x0 - i2 + 2.0 * C.xxx;
  // x3 = x0 - 1.0 + 3.0 * C.xxx;
  vec3 x1 = x0 - i1 + C.xxx;
  vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y
  vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y

// Permutations
  i = mod289(i);
  vec4 p = permute( permute( permute(
             i.z + vec4(0.0, i1.z, i2.z, 1.0 ))
           + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))
           + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));

// Gradients: 7x7 points over a square, mapped onto an octahedron.
// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)
  float n_ = 0.142857142857; // 1.0/7.0
  vec3 ns = n_ * D.wyz - D.xzx;

  vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)

  vec4 x_ = floor(j * ns.z);
  vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)

  vec4 x = x_ *ns.x + ns.yyyy;
  vec4 y = y_ *ns.x + ns.yyyy;
  vec4 h = 1.0 - abs(x) - abs(y);

  vec4 b0 = vec4( x.xy, y.xy );
  vec4 b1 = vec4( x.zw, y.zw );

  //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;
  //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;
  vec4 s0 = floor(b0)*2.0 + 1.0;
  vec4 s1 = floor(b1)*2.0 + 1.0;
  vec4 sh = -step(h, vec4(0.0));

  vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;
  vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;

  vec3 p0 = vec3(a0.xy,h.x);
  vec3 p1 = vec3(a0.zw,h.y);
  vec3 p2 = vec3(a1.xy,h.z);
  vec3 p3 = vec3(a1.zw,h.w);

//Normalise gradients
  vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));
  p0 *= norm.x;
  p1 *= norm.y;
  p2 *= norm.z;
  p3 *= norm.w;

// Mix final noise value
  vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);
  m = m * m;
  return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),
                                dot(p2,x2), dot(p3,x3) ) );
  }


uniform vec3 color1;
uniform vec3 color2;                        

uniform float t;

varying vec3 vTextureCoord;

void main()
{
    float t = 0.5; //mod(t, 3.0);
    float x = (vTextureCoord.x)*2.0;    
    float y = -(vTextureCoord.y)*2.0;                
    float r = sqrt(x * x + y * y);          

    gl_FragColor = vec4(0.0,0.0,0.0,0.0);   

    if(r<= 1.0){                                
        float n = snoise( vec3(vec2(x,y), Mr_T*3.3 ) );

        gl_FragColor = vec4( mix(color1,color2, abs(n) ) ,1.0);
    }

}

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top