OpenGL ES 1.1 Android Cubemapping - PullRequest
       0

OpenGL ES 1.1 Android Cubemapping

2 голосов
/ 25 декабря 2011

Я хочу получить простое отображение куба без использования текстурного атласа.Я могу привязать видимость любой из моих текстур в любой момент времени, но не могу сделать больше 1, не говоря уже о 6. Ниже приведен код из моего цикла рисования.

    /*Cube to draw */
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cube);

    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[2]);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, circleTexCoords);     
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[3]);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[4]);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[5]);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[6]);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4);
    gl.glBindTexture(GL10.GL_TEXTURE_2D,mTextures[7]);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4);

Я что-то упустил здесь?

Вещи, которые я проверил: Да, я сгенерировал текстурный буфер.Да, я правильно загрузил и привязал текстуры из своих ресурсов.Да, приведенный выше код работает, когда вместо связывания текстур я рисую его с помощью glColorf

Я ценю вашу помощь.

Редактировать:

Как я генерировал куб:

private float box[] = new float[] {
        // FRONT
        -0.5f, -0.5f,  0.5f,
         0.5f, -0.5f,  0.5f,
        -0.5f,  0.5f,  0.5f,
         0.5f,  0.5f,  0.5f,
        // BACK
        -0.5f, -0.5f, -0.5f,
        -0.5f,  0.5f, -0.5f,
         0.5f, -0.5f, -0.5f,
         0.5f,  0.5f, -0.5f,
        // LEFT
        -0.5f, -0.5f,  0.5f,
        -0.5f,  0.5f,  0.5f,
        -0.5f, -0.5f, -0.5f,
        -0.5f,  0.5f, -0.5f,
        // RIGHT
         0.5f, -0.5f, -0.5f,
         0.5f,  0.5f, -0.5f,
         0.5f, -0.5f,  0.5f,
         0.5f,  0.5f,  0.5f,
        // TOP
        -0.5f,  0.5f,  0.5f,
         0.5f,  0.5f,  0.5f,
         -0.5f,  0.5f, -0.5f,
         0.5f,  0.5f, -0.5f,
        // BOTTOM
        -0.5f, -0.5f,  0.5f,
        -0.5f, -0.5f, -0.5f,
         0.5f, -0.5f,  0.5f,
         0.5f, -0.5f, -0.5f,
};

 /* Initialize values for cube */
 ByteBuffer bb = ByteBuffer.allocateDirect(Float.SIZE * box.length);
 bb.order(ByteOrder.nativeOrder());
 cube = bb.asFloatBuffer();
 cube.put(box);
 cube.rewind();

CircleTexCoords - неправильное название, я использую его как единицу координат текстуры для нескольких различных текстур:

 bb = ByteBuffer.allocateDirect(Float.SIZE * 8);
 bb.order(ByteOrder.nativeOrder());
 circleTexCoords = bb.asFloatBuffer();
 circleTexCoords.put( new float[] { 0f, 1f, 1f, 1f, 0f, 0f, 1f, 0f});
 circleTexCoords.rewind();

1 Ответ

1 голос
/ 26 декабря 2011

Ваши массивы вершин не совпадают. При рисовании из включенных в настоящее время массивов атрибутов, в вашем случае vertex и tecCoords, массивы, конечно, должны совпадать по размеру. Когда вы вызываете glDrawArrays(..., 8, 4), вы указываете OpenGL рисовать 4 элемента массива (вершины), начиная с 8-го элемента. Но ваш массив texCoord содержит только 4 вершины, какими должны быть texCoords вершин 4-23 в вашем массиве вершин? Или как OpenGL должен знать, что вы хотите повторять texCoords для каждых 4 последовательных вершин.

Итак, чтобы он заработал, вам нужно повторить texCoords самостоятельно. Всегда имейте в виду, что размеры всех включенных массивов должны совпадать при рисовании из них (по крайней мере, до последнего нарисованного элемента). Так что ваша идея использовать этот маленький массив circleTexCoords не будет работать.

Это потому, что концептуально вершина - это не просто позиция, а совокупность всех атрибутов (позиции, нормали, texCoords, ...). Аналогично это вершина не только элемента из массива, связанного с glVertexPointer, но и из всех включенных в настоящее время массивов. Это также причина, по которой у вас не может быть одной вершины с двумя различными текстовыми связями без дублирования в OpenGL, потому что тогда она больше не будет единственной вершиной. Называть атрибут позиции vertex в OpenGL было немного плохим решением, хотя это больше из-за устаревших причин и было исправлено в современном OpenGL.

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