我正在使用 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;
}
我该如何修复这个错误