java - 使用三角形带对球体进行纹理化时出现问题

标签 java opengl

我正在学习 opengl,但渲染球体时遇到问题。我可以正常绘制和绑定(bind)多边形的纹理,但是当我尝试对三角形条绘制的球体使用相同的方法时,效果不太好。部分纹理已损坏。 (下图)

我可以知道我做错了什么吗?抱歉,如果这是一个显而易见的问题。

这是球体的代码: (添加纹理部分之前,球体可以正常显示)

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

最佳答案

主要问题是球体的顶盖被绘制了两次。这导致 Z-fighting 。注意,首先绘制PI-PI/gradation之间的 strip 。和PI然后用 PI 之间的 strip 绘制它和PI+PI/gradation 。这是因为外循环多做了一次。将其更改为:

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);
    // [...]
}

关于java - 使用三角形带对球体进行纹理化时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59890031/

相关文章:

java - 如何使我的第一人称相机流畅?

java - 无法在 Activity 之间传递数据。数据为空

java - 使用 String[][] 模拟 contains()

c# - OpenGL 函数 ChangeDisplaySettings (C++) 替代

opencv - 片段着色器 : texture2D() and texelFetch()

c++ - 对 openGL 版本感到困惑

Java 矩形问题

java - EJB环境下如何使用外部文件进行数据库配置

java - 使用 c 调用 REST 服务,通过 GSM 调制解调器连接 - HTTP/1.1 505

python - Vtk - 鼠标位置的世界坐标