使用 SFML 将地球纹理显示到 OpenGL 球体上时出现彩虹伪像错误

问题描述 投票:0回答:0

我正在使用 SFML 作为窗口,使用 OpenGL 来显示带有纹理的球体。然而,我没有看到地球纹理,而是看到了一个奇怪的彩虹神器。我在 Windows 11 上运行并使用 SFML 2.5.1 和 OpenGL 3.3。 这是代码

#include <SFML/OpenGL.hpp>
#include <GL/glu.h>

int main()
{
    sf::ContextSettings settings;
    settings.depthBits = 24;
    settings.stencilBits = 8;
    settings.antialiasingLevel = 4;

    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML OpenGL Sphere", sf::Style::Default, settings);

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glShadeModel(GL_SMOOTH);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glViewport(0, 0, window.getSize().x, window.getSize().y);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (GLfloat)window.getSize().x / (GLfloat)window.getSize().y, 0.1f, 100.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

    GLuint textureId;
    glGenTextures(1, &textureId);
    glBindTexture(GL_TEXTURE_2D, textureId);
    sf::Image textureImage;
    if (!textureImage.loadFromFile("C:/Users/---/Desktop/BOLTgui/BOLT/earth/earth.jpg"))
    {
        return EXIT_FAILURE;
    }
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textureImage.getSize().x, textureImage.getSize().y, 0, GL_RGB, GL_UNSIGNED_BYTE, textureImage.getPixelsPtr());
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    GLUquadric* sphere = gluNewQuadric();
    gluQuadricTexture(sphere, GL_TRUE);
    gluQuadricNormals(sphere, GLU_SMOOTH);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                window.close();
            }
        }

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glBindTexture(GL_TEXTURE_2D, textureId);
        glPushMatrix();
        glTranslatef(0.0f, 0.0f, 0.0f);
        glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
        glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
        gluSphere(sphere, 1.0f, 32, 32);
        glDisable(GL_TEXTURE_GEN_S);
        glDisable(GL_TEXTURE_GEN_T);
        glPopMatrix();
        glBindTexture(GL_TEXTURE_2D, 0);
        glEnable(GL_TEXTURE_2D);
        glEnable(GL_TEXTURE_GEN_S);
        glEnable(GL_TEXTURE_GEN_T);

        window.display();
    }

    gluDeleteQuadric(sphere);
    glDeleteTextures(1, &textureId);

    return 0;
}

继续展示奇怪的彩虹神器

而不是显示这个纹理

我该如何修复这个错误

c++ opengl sfml texturing
© www.soinside.com 2019 - 2024. All rights reserved.