2017-01-26 2 views
0

Je suis rendu la texture suivante à un WebGLRenderTarget en ThreeJS utilisant Ashima's GLSL noise:Trois JS: Le déplacement de vertex via des textures est-il limité à 256 valeurs?

enter image description here

Je suis ensuite lire les canaux RVB de la texture pour déplacer les sommets de plusieurs mailles dans les axes XYZ avec le code GLSL suivant :

vec4 fluctuation = texture2D(fluxTexture, uv); 
curPos.y += (fluctuation.r - 0.5) * 40.0; 
curPos.x += (fluctuation.g - 0.5) * 20.0; 
curPos.z += (fluctuation.b - 0.5) * 20.0; 

Cependant, étant donné que le mouvement est très subtil, j'ai remarqué que les sommets sauter quelques pixels pour chaque étape lorsque les valeurs RVB changent. J'attribue cet artefact à la limitation de chaque couleur à 256 valeurs chacune. Y at-il un moyen de changer la profondeur de bit de la texture à 16 ou 32 bits afin que je puisse obtenir plus de précision sur les canaux RVB?

+0

Il est bien sûr que vous devriez publier votre code concernant la création de la cible webgl. Vous pouvez également coder une autre précision dans une texture 8 bits ou plusieurs textures 8 bits. Trois a cette méthode pack/unpack dans les shaders. – pailhead

Répondre

2

Vous êtes intéressé par la propriété type d'une cible de rendu:

https://threejs.org/docs/?q=webgl#Reference/Constants/Textures

Vous pouvez essayer THREE.FloatType.

// Test for iOS devices, because they don't support THREE.FloatType 
var dataType = (/(iPad|iPhone|iPod)/g.test(navigator.userAgent)) ? THREE.HalfFloatType : THREE.FloatType; 

this.renderTarget = new THREE.WebGLRenderTarget(50, 50, { 
    format: THREE.RGBAFormat, 
    type: dataType, 
}); 
+0

Merci! J'ai fini par tomber sur cette réponse, mais ne pas complètement parce que contenterais de THREE.FloatType ne fonctionne pas sur iOS pour une raison quelconque, et la doc dit que 'UnsignedByteType',' 'UnsignedShort4444Type' ou THREE.UnsignedShort5551Type' sont autorisés . Savez-vous pourquoi c'est? Est-ce un problème de documentation? – Marquizzo

+0

Bizarre, je ne suis pas sûr que je pourrais avoir juré que je l'ai eu travailler sur iOS. Vous pouvez essayer quelque chose comme ceci pour l'encoder en 8 bits: https://github.com/mrdoob/three.js/blob/acdda10d5896aa10abdf33e971951dbf7bd8f074/src/renderers/shaders/ShaderChunk/packing.glsl#L17 – pailhead