Сегодня снова появился дикий баг, который у меня был несколько раз ...!
И я не знаю, как это исправить. Я надеюсь, что вы знаете хитрость для решения проблемы или официальный способ заставить ее работать. Некоторые учебники, кажется, не работают так, как обещают.
У меня есть несколько квадов, отображаемых в виде картинок на моем Surfaceview. У меня также есть две текстуры. Один для плитки и стен и один для объектов.
Я рисую плитки и объекты в своем собственном порядке изометрической системы. (из-за предотвращения наложения изображений)
На моем смартфоне это работает очень хорошо. Плитки используют текстуру плиток, а объекты - текстуру объектов.
Как вы видете. Сама комната нарисована с первой текстурой. Печи тянутся со второго. (Я использую Xperia Mini Pro)
Мой друг использует Галактику S. И теперь происходит нечто странное. Все четырехугольники используют одну и ту же текстуру. Я не нашел очевидного решения, как исправить ошибку.
Вот изображение, снятое камерой:
Во второй текстуре также есть красные плитки, так что не задумывайтесь о цвете. Дело в том, что все плитки внезапно используют первую текстуру. Вы не можете видеть какие-либо части, нарисованные со вторым.
Вот некоторые из моих функций рисования:
Функция для рисования картинок:
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);
Большое вам спасибо!