2016-04-16 13 views
2

シンプルなプログラムで、固定値の配列(本質的にルックアップテーブル)をシェーダに渡そうとしています。呼び出し元のコードは次のようになります。three.jsでシェーダに配列を渡す適切な方法

var displacement = []; 

    for (var y=0; y<46; y++) { 
     for (var x=0; x<46; x++) { 
      var sVal = Math.sin((((x/5.0)*40.0)/360.0)*Math.PI*2.0); 
      var index = x + 46 * y; 
      displacement[index] = sVal; 
     } 
    } 

    planeGeometry.addAttribute('displacement', new THREE.BufferAttribute(displacement, 1)); 

    var shaderMaterial = new THREE.ShaderMaterial({ 
     uniforms:  uniforms, // pass the "uniforms" vars 
     //attributes:  attributes, // and the attributes 
     side:THREE.DoubleSide,  // want the texture on both sides of the wave 
     vertexShader: vs,   // pointers to the shaders 
     fragmentShader: fs 
    }); 

シェーダは次のようになります。R72に先立ち、私はシェーダ材料のコンストラクタ内の属性として配列を渡すが、今それが持っている

<script id="vertexShader" type="x-shader/x-fragment"> 
     varying vec2  vUv; 
     attribute float  displacement; 
     uniform float  amplitude; 
     void main() { 
      vUv = uv; 
      vec3 newPosition = position + normal * vec3(displacement * amplitude); 
      gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0); 
     } 
    </script> 

bufferGeometry属性として渡されます。古い方法は働いていたが、今では入手

[.CommandBufferContext] GLのERROR:GL_INVALID_OPERATION:glDrawElements:属性範囲の頂点のうち、アクセスしようとすると、私はこれを行う方法の全体の束を試してみた1

しかし、それらのどれも働かない。誰かがこれを行う正しい方法を知っていますか?

答えて

1

JS配列ではなく、置換配列の型付き配列を使用する必要があります。 r.75

+0

three.js

var displacement = new Float32Array(size); 

魅力のように働きました!とても簡単!ありがとう!あなたはthree.jsのロックであなた! – rkwright

関連する問題