Задача текстурирования сферы с использованием треугольной полосы - PullRequest
1 голос
/ 24 января 2020

Я изучаю opengl, но у меня проблема с рендерингом сферы. Я могу рисовать и связывать текстуру многоугольника обычным образом, но когда я пытаюсь использовать тот же метод для сферы, нарисованной треугольной полосой, она просто не удалась. Часть текстуры сломана. (Pi c ниже)

Могу ли я знать, что я сделал неправильно? Извините, если это очевидный вопрос.

Вот код сферы: (перед добавлением текстурной части сфера может отображаться нормально)

private void drawSphere(GL gl) {
        Position spherePosition = state.getSpherePosition();
        final float PI = 3.141592f;
        gl.glPushMatrix();
        if(spheretexture == null){
           setSphereTexture();
        }

        gl.glTranslated(spherePosition.getX(), spherePosition.getY(), spherePosition.getZ());
        float[] ambientDiffuse = new float[] {255.0f, 255.0f, 255.0f, 1.0f};
        gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_AMBIENT_AND_DIFFUSE, ambientDiffuse, 0);

        gl.glEnable(GL_BLEND);
        gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        float x, y, z, alpha, beta; // Storage for coordinates and angles
        float radius = 25f;
        int gradation = 10;
        for (alpha = 0.0f; alpha < PI; alpha += PI / gradation) {
        spheretexture.enable();
        spheretexture.bind();
        gl.glBegin(GL_TRIANGLE_STRIP);
        for (beta = 0.0f; beta < 2.01 * PI; beta += PI / gradation) {
            x = (float) (radius * Math.cos(beta) * Math.sin(alpha));
            y = (float) (radius * Math.sin(beta) * Math.sin(alpha));
            z = (float) (radius * Math.cos(alpha));
            gl.glTexCoord2f(beta / (2.0f * PI), alpha / PI);
            gl.glVertex3f(x, y, z);
            x = (float) (radius * Math.cos(beta) * Math.sin(alpha + PI / gradation));
            y = (float) (radius * Math.sin(beta) * Math.sin(alpha + PI / gradation));
            z = (float) (radius * Math.cos(alpha + PI / gradation));
            gl.glTexCoord2f(beta / (2.0f * PI), alpha / PI + 1.0f / gradation);
            gl.glVertex3f(x, y, z);
        }

        gl.glEnd();

        spheretexture.disable();
        gl.glDisable(GL_BLEND);
        gl.glPopMatrix();
    }

    }

Вывод изображения: img

1 Ответ

1 голос
/ 25 января 2020

Основная проблема заключается в том, что верхняя крышка сферы нарисована дважды. Это вызывает Z-fight . Обратите внимание: сначала рисуется полоса между PI-PI/gradation и PI, а затем полоса между PI и PI+PI/gradation. Это вызвано тем, что внешний l oop делает один дополнительный проход. Измените его на:

for (alpha = 0.0f; alpha < PI-PI/gradation; alpha += PI / gradation) {
    // [...]
}

или даже лучше

for (int i = 0; i < gradation; ++ i ) {
    float alpha =  PI * (float)i / (float)(gradation);
    // [...]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...