OpenGL (ES) - рисование цилиндра с использованием треугольных полос - PullRequest
2 голосов
/ 07 мая 2011

РЕДАКТИРОВАТЬ РЕШЕНИЕ: цилиндр в openGL ES:


///Storing a cylinder in a VBO
int verticesCyl = 60;
int indicesCyl = verticesCyl + 2;
float cylHeight = .2f;

void initCylinder(GL10 gl) {
        GL11 gl11 = (GL11) gl;
        FloatBuffer vertBuffer = ByteBuffer.allocateDirect(verticesCyl * 3 * 
                4).order(ByteOrder.nativeOrder())
                .asFloatBuffer();
        ShortBuffer indexBuffer = ByteBuffer.allocateDirect(indicesCyl *               2).order(ByteOrder.nativeOrder())
                .asShortBuffer();

        float vertices[] = new float[verticesCyl * 3];
        short indices[] = new short[indicesCyl];
        for (int j = 0; j &lt verticesCyl*3 ; j+=3) {
            vertices[j] = (float) (Math.cos(theta));
            vertices[j+1] = (float) (Math.sin(theta));
            vertices[j+2] = j % 2 == 0 ? cylHeight : -cylHeight;
            theta += 2 * Math.PI / (verticesCyl);
        }

        for (int j = 0; j &lt indicesCyl; j++) {
                indices[j] = (short) (j % verticesCyl) ;
        }

        indexBuffer.put(indices);
        vertBuffer.put(vertices);
        indexBuffer.flip();
        vertBuffer.flip();

        int[] buffer = new int[1];

        gl11.glGenBuffers(1, buffer, 0);
        vertexPointerCyl = buffer[0];
        gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexPointerCyl);
        gl11.glBufferData(GL11.GL_ARRAY_BUFFER, vertBuffer.capacity() * 4, vertBuffer, GL11.GL_STATIC_DRAW);
        gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);
        gl11.glGenBuffers(1, buffer, 0);
        indexPointerCyl = buffer[0];
        gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indexPointerCyl);
        gl11.glBufferData(GL11.GL_ELEMENT_ARRAY_BUFFER, indexBuffer.capacity() * 2, indexBuffer, GL11.GL_STATIC_DRAW);
    }

////////////Draw the cylinder
        gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexPointerCyl);
        gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indexPointerCyl);
        gl11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0);
        gl11.glPushMatrix();
        gl11.glColor4f(shadowColor,shadowColor,shadowColor, alpha);
        gl11.glTranslatef(mainX, mainY, 0);
        gl11.glScalef(scaleFactor, scaleFactor, 0);
        gl11.glRotatef(rotateCylinder, mainX, mainY, 0);
        gl11.glDrawElements(GL11.GL_TRIANGLE_STRIP, indicesCyl, GL11.GL_UNSIGNED_SHORT, 0);
        gl11.glPopMatrix();

1 Ответ

3 голосов
/ 07 мая 2011

Вопросы для рассмотрения:

  1. Вы "очищаете" графический контекст?(Я предполагаю, что вы используете Android, но я не знаю точный API для вызова)
  2. Вы загрузили буфер с "glBufferData"?
  3. Вы включили состояние клиента вершины с"glEnableClientState (GL_VERTEX_ARRAY)"?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...