今天我曾多次出现过一次野生虫子再次出现......!
我不知道如何修复它。我希望你知道一个解决问题的方法或一个正式的方法来使它工作。一些教程似乎没有以他们承诺的正确方式工作。
我有一些四边形,在Surfaceview上显示为图片。我也有两个纹理。一个用于瓷砖和墙壁,一个用于物体到目前为止。
我按照自己的等距系统顺序绘制瓷砖和对象。 (因为防止图像重叠) 在我的智能手机上,它运作良好。切片使用切片的纹理,对象使用对象的纹理。
如你看到的。房间本身是用第一个纹理绘制的。用第二个烤箱画出烤箱。 (我使用Xperia Mini Pro)
我的一个朋友使用Galaxy 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);
}
这里的函数只是用于生成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);
非常感谢你!
答案 0 :(得分:1)
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, this.imagetexture.unit);
GLES20.glUniform1i(ShaderCache.activeShader.texture, this.imagetexture.unit);
我认为这是错误的。传递给glsl的sampler2d统一值应该是 sampler 的编号,而不是纹理的id。如果将纹理id 3绑定到采样器0(glActiveTexture(GL_TEXTURE0)),则将0传递给统一采样器2d,而不是3.如果将纹理绑定到GL_TEXTURE1,则sampler2d值将变为1,等等。