2017-01-26 5 views
0

私はAshima's GLSL noiseを使用してThreeJSでWebGLRenderTargetに次のテクスチャをレンダリングしています:3つのJS:テクスチャによる頂点変位は256の値に制限されますか?

enter image description here

私は、XYZにいくつかのメッシュの頂点を変位させるテクスチャのRGBチャンネルを読んでいるが、次のGLSLコードで軸:動きが非常に微妙であるため、

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; 

しかし、私はRGBの値が変更されたときの頂点がすべてのステップのためのいくつかのピクセルをジャンプことに気付きました。私はこのアーティファクトを各色の256個の値に限定しています。テクスチャのビット深度を16ビットまたは32ビットに変更する方法はありますか?そうすれば、RGBチャンネルの精度をさらに高めることができますか?

+0

もちろん、webglターゲットの作成に関するコードを掲載する必要があります。また、他の精度を8ビットテクスチャまたは複数の8ビットテクスチャでエンコードすることもできます。 3つは、シェイダーにパック/アンパックメソッドを持っています。 – pailhead

答えて

2

あなたはレンダーターゲットのtypeプロパティに興味がある:

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

あなたが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

ありがとう!私はこの答えにつまずいてしまいましたが、THREE.FloatTypeが何らかの理由でiOS上で動作しないため、 'UnsignedByteType'、' UnsignedShort4444Type'または 'THREE.UnsignedShort5551Type'のみが許可されているため。なぜそれが分かっていますか?それはドキュメントの問題ですか? – Marquizzo

+0

奇妙なことに、私はiOSで動いていると誓ってもいいか分からない。これを8ビットにエンコードすることができます: https://github.com/mrdoob/three.js/blob/acdda10d5896aa10abdf33e971951dbf7bd8f074/src/renderers/shaders/ShaderChunk/packing.glsl#L17 – pailhead

関連する問題