Java 显示相同的纹理。约束问题?

Java 显示相同的纹理。约束问题?,java,android,data-binding,opengl-es,textures,Java,Android,Data Binding,Opengl Es,Textures,今天又出现了一只我以前吃过好几次的野虫子 我也不知道如何修复它。我希望你知道解决这个问题的诀窍,或是让它工作的官方方法。有些教程似乎没有按照它们承诺的正确方式工作 我有一些四边形,在我的Surfaceview上显示为图片。我也有两种纹理。一个用于瓷砖和墙壁,另一个用于到目前为止的对象 我以自己的等距系统顺序绘制瓷砖和对象。(因为可以防止图像重叠) 在我的智能手机上,它工作得很好。瓷砖使用瓷砖的纹理,对象使用对象的纹理 如你所见。房间本身使用第一个纹理绘制。烤箱是用第二个画的。(我使用Xperi

今天又出现了一只我以前吃过好几次的野虫子

我也不知道如何修复它。我希望你知道解决这个问题的诀窍,或是让它工作的官方方法。有些教程似乎没有按照它们承诺的正确方式工作

我有一些四边形,在我的Surfaceview上显示为图片。我也有两种纹理。一个用于瓷砖和墙壁,另一个用于到目前为止的对象

我以自己的等距系统顺序绘制瓷砖和对象。(因为可以防止图像重叠) 在我的智能手机上,它工作得很好。瓷砖使用瓷砖的纹理,对象使用对象的纹理

如你所见。房间本身使用第一个纹理绘制。烤箱是用第二个画的。(我使用Xperia Mini Pro)

我的一个朋友使用星系S。现在,一些奇怪的事情正在发生。所有四边形都使用相同的纹理。我没有找到明显的解决方案来修复这个bug。 以下是用相机拍摄的图像: 在第二种纹理中也有红色的瓷砖,所以不要对颜色感到奇怪。事实是,所有的瓷砖都突然使用了第一种纹理。您无法看到使用第二个零件绘制的任何零件

以下是我的一些绘图功能:

用于绘制图片的功能:

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);
}
这里是生成纹理单元的函数:

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);
非常感谢你

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

我认为这是错误的。传递给glsl的sampler2d统一值应该是采样器的编号,而不是纹理的id。如果将纹理id 3绑定到采样器0(glActiveTexture(GL_TEXTURE0)),则将0传递到统一采样器2D,而不是3。如果将纹理绑定到GL_TEXTURE1,则sampler2d值将变为1,以此类推。

切勿在教程中阅读此内容。但我相信你!听起来有点合乎逻辑。我会尝试一下并做一个报告;)