2012-03-10 10 views
0

今日私は数回前に出た野生のバグが再び現れました...!同じテクスチャが表示されます。バインディングの問題?

それを修正する方法はわかりません。私はあなたが問題を解決するためのトリックやそれを働かせる公式の方法を知っていれば幸いです。チュートリアルの中には、彼らが約束する正しい方法で動作しないように見えるものがあります。

私はSurfaceviewで画像として表示されたいくつかのクワッドを持っています。私は2つのテクスチャも持っています。 1つはタイルと壁用、もう1つはオブジェクト用です。

私はアイソメトリックシステムの自分の順序でタイルとオブジェクトを描画します。 (画像の重複を避けるため) 私のスマートフォンでは、それはとてもうまく動作します。タイルはタイルのテクスチャを使用し、オブジェクトはオブジェクトのテクスチャを使用します。

The cube is just for testing fusion of 2D and 3D ご覧のとおりです。部屋自体は最初のテクスチャで描画されます。オーブンは2番目のオーブンで描かれています。 (私はXperia Mini Proを使用しています)

私の友人はGalaxy Sを使用しています。今、何か変わったことが起こっています。すべてのクワッドは同じテクスチャを使用しています。バグを修正する方法を発見した明らかな解決策はありません。 ここでカメラで撮影した画像: enter image description here 2番目のテクスチャには赤いタイルもありますので、色について疑問に思ってはいけません。事実、すべてのタイルが突然最初のテクスチャを使用するということです。 2つ目の部分で描画された部分は表示されません。

public void render(float posX, float posY) { 
    // ======== Pass Masking Color ======== 
    if (this.masked) { 
     GLES20.glUniform1i(ShaderCache.activeShader.masked, 1); 
     GLES20.glUniform3i(ShaderCache.activeShader.maskColor, this.maskColor.r, this.maskColor.g, this.maskColor.b); 
    } else { 
     GLES20.glUniform1i(ShaderCache.activeShader.masked, 0); 
    } 
    // ======== Passing Vertex And UV Attributes ======== 
    if (ImageCache.lastUsedImageBuffer != this.buffer) { 
     GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, this.buffer); 
     GLES20.glVertexAttribPointer(ShaderCache.activeShader.attributeVertex, 2, GLES20.GL_FLOAT, false, 16, 0); 
     GLES20.glVertexAttribPointer(ShaderCache.activeShader.attributeUV, 2, GLES20.GL_FLOAT, false, 16, 8); 
     ImageCache.lastUsedImageBuffer = this.buffer; 
    } 
    // ======== Set Sampler Texture2D ======== 
    if (TextureCache.lastTextureUnit != this.imagetexture.unit) { 
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, this.imagetexture.unit); 
     GLES20.glUniform1i(ShaderCache.activeShader.texture, this.imagetexture.unit); 
     TextureCache.lastTextureUnit = this.imagetexture.unit; 
    } 
    // ======== Passing Image Position ======== 
    GLES20.glUniform2f(ShaderCache.activeShader.position, posX, posY); 
    // ======== Draw Arrays With Image Vertices ======== 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, this.vertices); 
} 

そしてここで機能をちょうどtextureunitsを生成するために:

機能絵を描くために:ここで

は私の描画機能のいくつかはある

int[] textureID = new int[1]; 
GLES20.glGenTextures(1, textureID, 0); 
this.unit = textureID[0]; 
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + this.unit); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, this.unit); 

はありがとうございました!

答えて

1
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, this.imagetexture.unit); 
    GLES20.glUniform1i(ShaderCache.activeShader.texture, this.imagetexture.unit); 

私はこれが間違っていると思います。 glslに渡すsampler2d uniform値は、サンプラーの番号で、テクスチャのIDではありません。テクスチャID 3をサンプラ0(glActiveTexture(GL_TEXTURE0))にバインドすると、3ではなくuniform sampler2dに0が渡されます.GL_TEXTURE1にテクスチャをバインドすると、sampler2dの値は1になります。

+0

チュートリアルでこれを説明しますしかし、私はあなたを信じています!論理的に聞こえる私はそれを試してみて、報告する;) – TheWhiteLlama

+0

ちょうど完璧!今それは他のデバイスでも動作します! :) – TheWhiteLlama

関連する問題