Рендеринг изображения для использования 2D-игры в OpenGL ES для Android - PullRequest
0 голосов
/ 22 марта 2011

РЕДАКТИРОВАТЬ: Решено!Я сделал глупую ошибку, у меня был textureId, о котором я забыл, когда это был textureID, который я должен использовать.

Хорошо, я полностью осознаю, что это повторяющийся вопрос, и что есть много уроков иоткрытый исходный код.Но я старался изо всех сил здесь довольно долго, и мой экран все еще пуст (с любым цветом, который я установил, используя glClearColor ()).

Итак, я был бы благодарен за некоторые указателик тому, что я делаю неправильно, или даже лучше, к некоторому рабочему коду, который будет отображать изображение ресурса.

Я покажу, что у меня получилось (выполнив некоторые хитрые вставки копий) в моем onDrawFrame класса, который реализует Renderer.Я удалил некоторые скачки между методами и просто вставлю их в порядке их выполнения.

Не стесняйтесь игнорировать мой текущий код, я более чем рад начать все заново, если кто-нибудь сможетдай мне рабочий кусок кода.

Настройка:

    bitmap = BitmapFactory.decodeResource(panel.getResources(), 
            R.drawable.test); 
    addGameComponent(new MeleeAttackComponent());

    // Mapping coordinates for the vertices
    float textureCoordinates[] = { 0.0f, 2.0f, //
            2.0f, 2.0f, //
            0.0f, 0.0f, //
            2.0f, 0.0f, //
    };

    short[] indices = new short[] { 0, 1, 2, 1, 3, 2 };

    float[] vertices = new float[] { -0.5f, -0.5f, 0.0f,
                                      0.5f, -0.5f, 0.0f,
                                     -0.5f,  0.5f, 0.0f,
                                      0.5f, 0.5f, 0.0f };

    setIndices(indices);
    setVertices(vertices);
    setTextureCoordinates(textureCoordinates);

protected void setVertices(float[] vertices) {
    // a float is 4 bytes, therefore we multiply the number if
    // vertices with 4.
    ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
    vbb.order(ByteOrder.nativeOrder());
    mVerticesBuffer = vbb.asFloatBuffer();
    mVerticesBuffer.put(vertices);
    mVerticesBuffer.position(0);
}


protected void setIndices(short[] indices) {
    // short is 2 bytes, therefore we multiply the number if
    // vertices with 2.
    ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
    ibb.order(ByteOrder.nativeOrder());
    mIndicesBuffer = ibb.asShortBuffer();
    mIndicesBuffer.put(indices);
    mIndicesBuffer.position(0);
    mNumOfIndices = indices.length;
}


protected void setTextureCoordinates(float[] textureCoords) { 

    // float is 4 bytes, therefore we multiply the number of
    // vertices with 4.
    ByteBuffer byteBuf = ByteBuffer
            .allocateDirect(textureCoords.length * 4);
    byteBuf.order(ByteOrder.nativeOrder());
    mTextureBuffer = byteBuf.asFloatBuffer();
    mTextureBuffer.put(textureCoords);
    mTextureBuffer.position(0);
}

// OnDrawFrame (GL10 gl)

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    gl.glLoadIdentity();
    gl.glTranslatef(0, 0, -4);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    // Specifies the location and data format of an array of vertex
    // coordinates to use when rendering.
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVerticesBuffer);

    if(shoudlLoadTexture){
        loadGLTextures(gl);
        shoudlLoadTexture = false;
    }

    if (mTextureId != -1 && mTextureBuffer != null) {
        gl.glEnable(GL10.GL_TEXTURE_2D);
        // Enable the texture state
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

        // Point to our buffers
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId);
    }

    gl.glTranslatef(posX, posY, 0);
    // Point out the where the color buffer is.
    gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndices,
            GL10.GL_UNSIGNED_SHORT, mIndicesBuffer);
    // Disable the vertices buffer.
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

    if (mTextureId != -1 && mTextureBuffer != null) {
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    }


 private void loadGLTextures(GL10 gl) {

    int[] textures = new int[1];
    gl.glGenTextures(1, textures, 0);
    mTextureID = textures[0];

    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

}

Не вылетает, без исключенийПросто пустой экран с цветом.Я там напечатал материал, так что я уверен, что все это выполнено.

Я знаю, что не оптимально просто вставлять код, но сейчас я просто хочу иметь возможность делать то, что я мог делать с canvas:)

Большое спасибо

1 Ответ

1 голос
/ 23 марта 2011

Если вы получаете цвет фона, это означает, что ваше окно правильно настроено. OpenGL подключен к этой области экрана.

Однако OpenGL обрезает ближнюю и дальнюю плоскости обрезки, гарантируя, что объекты не пересекают и не пересекают камеру (что математически и логически не имеет смысла) и что объекты, находящиеся слишком далеко, не появляются , Поэтому, если вы неправильно настроили вид и проекцию модели, вероятно, что вся ваша геометрия обрезана.

Modelview используется для отображения из мира в пространство глаз. Проекционные карты из пространства глаза в пространство экрана. Таким образом, типичные приложения используют первое для позиционирования объектов в пределах сцены и позиционирования сцены относительно камеры, затем второе имеет дело с тем, видит ли камера в перспективе или нет, сколько мировых единиц составляет сколько единиц экрана и т. Д.

Если вы посмотрите на примеры , подобные этому , в частности onSurfaceChanged, вы увидите пример перспективной проекции с камерой, зафиксированной в начале координат.

Поскольку камера находится в положении (0, 0, 0), при оставлении вашей геометрии на z = 0, как это делает ваш код, оно будет обрезано. В этом примере кода они установили плоскость ближнего отсечения равной z = 0,1, поэтому в существующем коде вы можете изменить:

gl.glTranslatef(posX, posY, 0);

Кому:

gl.glTranslatef(posX, posY, -1.0);

Чтобы отодвинуть вашу геометрию назад достаточно далеко, чтобы появиться на экране.

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