2017-12-15 7 views
0

私の最初のプログラムでアルファマップを作成しようとしました。 2番目のプログラムは時々最初はそれをマスクなしで実行されますので、これらについて以来、二つの別々のクラスを使用してWebgl - プログラム1でテクスチャを作成し、プログラム2に送信します。ユニット0にバインドされたテクスチャなし

​​

イム:それはすべてイムはエラーを取得しかし、正しく設定しまった私は、アイブのように感じます。

どちらのプログラムも同じglコンテキストで実行されています。私は最初のプログラムの順番でセットアップコードを実行し、次に2番目のプログラムを実行し、その後同じ順序で描画関数を実行します。プログラム1(アルファマップの作成)の

セットアップ:

// Get gl, add blending ect, then... 

// The webgl variable below just holds webgl constants from https://google.github.io/closure-library/api/goog.webgl.html 

this.targetTexture_ = this.gl_.createTexture(); 
this.gl_.activeTexture(webgl.TEXTURE0); 
this.gl_.bindTexture(webgl.TEXTURE_2D, this.targetTexture_); 
this.gl_.texImage2D(webgl.TEXTURE_2D, 0, webgl.RGBA, this.gl_.canvas.width, 
    this.gl_.canvas.height, 0, webgl.RGBA, webgl.UNSIGNED_BYTE, null); 

this.gl_.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_MIN_FILTER, webgl.LINEAR); 
this.gl_.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_WRAP_S, webgl.CLAMP_TO_EDGE); 
this.gl_.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_WRAP_T, webgl.CLAMP_TO_EDGE); 

this.textureFrameBuffer_ = this.gl_.createFramebuffer(); 
this.gl_.bindFramebuffer(webgl.FRAMEBUFFER, this.textureFrameBuffer_); 
this.gl_.framebufferTexture2D(webgl.FRAMEBUFFER, webgl.COLOR_ATTACHMENT0, webgl.TEXTURE_2D, this.targetTexture_, 0); 

// Now i set the maskTexture on the second programs class. 
this.secondProgramClass.maskTexture = this.targetTexture_; 

// Now i compile & attach the shaders and link the program 

次にプログラム2のセットアップ:

// Compile, attach, link up the program... 

// This is the texture location to use. 
this.maskTextureLocation_ = 
    this.gl_.getUniformLocation(this.program_, LocationName.MASK); 

プログラム1のドロー機能:

this.gl_.bindFramebuffer(webgl.FRAMEBUFFER, this.textureFrameBuffer_); 
this.gl_.bindTexture(webgl.TEXTURE_2D, this.targetTexture_); 
this.gl_.viewport(0, 0, this.gl_.canvas.width, this.gl_.canvas.height); 

// Clear to transparent 
this.gl_.clearColor(0, 0, 0, 0); 
this.gl_.clear(webgl.COLOR_BUFFER_BIT | webgl.DEPTH_BUFFER_BIT); 

this.gl_.useProgram(this.program_); 

// A helper function that runs: enableVertexAttribArray, bindBuffer, vertexAttribPointer on the objects location and buffer. 
// In this case its just a square the size of the viewport. 
renderBufferAttribute(this.gl_, this.position_); 

// Draw triangles 
this.gl_.drawArrays(webgl.TRIANGLES, 0, 6); 
プログラム2の

Draw関数:今、このクラスはmaskTextureは、最初のクラスのセットアップから、それに設定し、最初のクラスは、テクスチャへの描画機能を実行した後、私はこのプログラムを描画することができるはずがあること

テクスチャを通過させて、右?私はイムは何も見つからないと思ういけないが、任意の

// Stored in LocationName.MASK above. 
uniform sampler2D u_mask; 

:現時点で

this.gl_.bindFramebuffer(webgl.FRAMEBUFFER, null); 

this.gl_.clearColor(0, 0, 0, 0); 
this.gl_.clear(webgl.COLOR_BUFFER_BIT); 

this.gl_.useProgram(this.program_); 

// A helper function that runs: enableVertexAttribArray, bindBuffer, vertexAttribPointer on the objects location and buffer. 
renderBufferAttribute(this.gl_, this.position_); 

if (this.maskTexture) { 
    this.gl_.activeTexture(this.gl_.TEXTURE0); 
    this.gl_.bindTexture(webgl.TEXTURE_2D, this.maskTexture); 
    this.gl_.uniform1i(this.maskTextureLocation_, 0); 
} 

// Draw triangles 
this.gl_.drawArrays(webgl.TRIANGLES, 0, 
    this.particleCount_.total * PARTICLE_ARRAY_COUNT/2); 

シェーダは、おそらくこの質問には無関係である、我々は、彼らの両方が期待秒1でのブロックをレンダリングするだけと仮定することができます方向は高く評価されるだろう。私はすべての描画サイクルで上記のエラーを取得しています。必要に応じて詳細情報を更新します。

ありがとうございます!

答えて

0

私は、webglコンテキスト上のテクスチャユニット0に自動的にバインドされているので、テクスチャをどこにでも送信する必要はありません。したがって、最初のプログラムがテクスチャ0に描画されると、2番目のプログラムは既にテ​​クスチャ0に同じデータを持ちます。

関連する問題