Та же текстура отображается.Обязательный вопрос? - PullRequest
0 голосов
/ 10 марта 2012

Сегодня снова появился дикий баг, который у меня был несколько раз ...!

И я не знаю, как это исправить. Я надеюсь, что вы знаете хитрость для решения проблемы или официальный способ заставить ее работать. Некоторые учебники, кажется, не работают так, как обещают.

У меня есть несколько квадов, отображаемых в виде картинок на моем Surfaceview. У меня также есть две текстуры. Один для плитки и стен и один для объектов.

Я рисую плитки и объекты в своем собственном порядке изометрической системы. (из-за предотвращения наложения изображений) На моем смартфоне это работает очень хорошо. Плитки используют текстуру плиток, а объекты - текстуру объектов.

The cube is just for testing fusion of 2D and 3D Как вы видете. Сама комната нарисована с первой текстурой. Печи тянутся со второго. (Я использую Xperia Mini Pro)

Мой друг использует Галактику S. И теперь происходит нечто странное. Все четырехугольники используют одну и ту же текстуру. Я не нашел очевидного решения, как исправить ошибку. Вот изображение, снятое камерой: enter image description here Во второй текстуре также есть красные плитки, так что не задумывайтесь о цвете. Дело в том, что все плитки внезапно используют первую текстуру. Вы не можете видеть какие-либо части, нарисованные со вторым.

Вот некоторые из моих функций рисования:

Функция для рисования картинок:

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);

Большое вам спасибо!

1 Ответ

1 голос
/ 10 марта 2012
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, this.imagetexture.unit);
    GLES20.glUniform1i(ShaderCache.activeShader.texture, this.imagetexture.unit);

Я считаю, что это неправильно.Равномерное значение sampler2d, которое вы передаете в glsl, должно быть номером sampler , а не id текстуры.Если вы привязываете идентификатор текстуры 3 к сэмплеру 0 (glActiveTexture (GL_TEXTURE0)), то вы передаете 0 в единый sampler2d, а не 3. Если вы привязываете текстуру к GL_TEXTURE1, тогда значение sampler2d становится равным 1 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...