Круг TRIANGLE_FAN не рисуется после рисования квадратов с текстурами - PullRequest
2 голосов
/ 01 сентября 2011

ОБНОВЛЕНИЕ: Резюме: я могу нарисовать круг, используя TRIANGLE_FAN, и, отдельно, я также могу нарисовать два квадрата с растровыми изображениями в качестве текстур.Но проблема в том, когда я рисую текстуры, а затем круги.Круги не нарисованы.

Я рисую два текстурированных квадрата (по 4 вершины каждый).Затем я рисую круг, используя GL_TRIANGLE_FAN, но он рисуется неправильно (см. Изображения).

Когда я рисую круги без квадратов, они рисуются правильно.

Любые идеи, которые могли быбыть проблемой?

Пожалуйста, попросите дополнительную информацию.Спасибо

Добавление некоторого кода, который я считаю важным:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glFrontFace(GL10.GL_CCW);
    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glEnable(GL10.GL_BLEND);
    gl.glCullFace(GL10.GL_BACK);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnable(GL10.GL_TEXTURE_2D);
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glOrthof(0, w, -0, h, -1, 1);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
}

public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
    circle.draw(gl);
    needle.draw(gl);
    synchronized (tokens) {
        for (Token d : tokens) {
            d.draw(gl);
        }
    }
}

Обновление: некоторые скриншоты.Без рисования кругов и игл: Without bitmaps

Рисование кругов и игл: With bitmaps (посмотрите на те красные линии, где должен быть круг)

Единственное изменение в коде между этимиизображения комментируют строки

circle.draw(gl);
needle.draw(gl);

Токен:

public void draw(GL10 gl) {
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    gl.glPushMatrix();
    gl.glTranslatef(x, y, 0f);
    gl.glScalef(radius, radius, 0f);
    gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, nVertices+2);
    gl.glPopMatrix();
}

Круг и игла:

    public void draw(GL10 gl) {
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    if (shouldLoadTexture) {
        loadGLTexture(gl);
        shouldLoadTexture = false;
    }


    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

    gl.glPushMatrix();
    gl.glTranslatef(x, y, 0f);
    gl.glRotatef((float) angle, 0f, 0f, 1f);
    angle += rotAngle;
    if(angle+rotAngle > 360.0)
        angle -= 360.0;
    gl.glScalef(width, height, 0f);
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,
            GL10.GL_UNSIGNED_SHORT, indexBuffer);
    gl.glPopMatrix();

}

private void loadGLTexture(GL10 gl) {

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

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

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

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

Обновление:

Следуя словам Арнев первом ответе я изменил:

public void draw(GL10 gl) {
            //New line
            gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    if (shouldLoadTexture) {
        loadGLTexture(gl);
        shouldLoadTexture = false;
    }


    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

    gl.glPushMatrix();
    gl.glTranslatef(x, y, 0f);
    gl.glRotatef((float) angle, 0f, 0f, 1f);
    angle += rotAngle;
    if(angle+rotAngle > 360.0)
        angle -= 360.0;
    gl.glScalef(width, height, 0f);
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,
            GL10.GL_UNSIGNED_SHORT, indexBuffer);
    gl.glPopMatrix();
            //New line
            gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}

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

Обновление:

Когда я не загружаю текстуру круга и иглы (просто комментируя вызов loadTexture ()), я получаю это:

Commenting loadTexture()

Так что проблема должна быть с текстурами.

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Вы включаете текстурирование (вызывая glEnable(GL_TEXTURE_2D)) в начале, но не предоставляете своим кругам (жетонам) какие-либо текстурные координаты. Поскольку я предполагаю, что они не должны быть текстурированными, вы должны включить текстурирование только для действительно текстурированных объектов и снова отключить текстурирование после их рисования, так же, как вы включаете и отключаете массив texCoord в своем обновленном коде.

1 голос
/ 02 сентября 2011

Попробуйте отключить GL_TEXTURE_COORD_ARRAY, прежде чем рисовать круги с помощью

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