无法使用opengl& amp;在我的立方体上应用纹理SFML

时间:2016-08-23 10:58:02

标签: c++ opengl sfml

我想在立方体上的一张脸上加载纹理。所有其他面孔都有我特定的颜色。问题是,当我尝试应用纹理时,它不会显示它。相反,正在应用立方体上使用的最后一个纹理。

以下是代码示例:

Engine::Engine() : m_isMovingUp(false), m_isMovingDown(false), m_isMovingLeft(false), m_isMovingRight(false), m_context(24, 8, 4, 3, 3), m_angleX(0), m_angleZ(0), m_mov(3.0f, 3.0f, 3.0f)
{
    //Window settings
    m_win.create(sf::VideoMode(800, 600), "SFML Event and with some OpenGL graphics", sf::Style::Default, m_context);
    m_win.setFramerateLimit(60);

    //Opengl settings
    glEnable(GL_TEXTURE_2D);
    m_textureID = loadTexture("/Data/test.jpg");
 }

void Engine::run()
{
    bool running = true;
    while (running)
    {
        processEvents();
        update();
        render();
    }
}


void Engine::cube()
{
    //glRotated(m_angleX, 1, 0, 0);
    //glRotated(m_angleZ, 0, 0, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glBindTexture(GL_TEXTURE_2D, m_textureID);
    glBegin(GL_QUADS);
    //face Rouge
    //glColor3ub(255, 0, 0);
    glTexCoord2d(0, 1); glVertex3d(1, 1, 1);
    glTexCoord2d(0, 0); glVertex3d(1, 1, -1);
    glTexCoord2d(1, 0); glVertex3d(-1, 1, -1);
    glTexCoord2d(1, 1); glVertex3d(-1, 1, 1);
    glEnd();
    glBegin(GL_QUADS);
    //face verte
    glColor3ub(0, 255, 0); 
    glVertex3d(1, -1, 1);
    glVertex3d(1, -1, -1);
    glVertex3d(1, 1, -1);
    glVertex3d(1, 1, 1);

    //face bleu
    glColor3ub(0, 0, 255);
    glVertex3d(1, -1, 1);
    glVertex3d(-1, -1, 1);
    glVertex3d(-1, -1, -1);
    glVertex3d(1, -1, -1);

    //face jaune
    glColor3ub(255, 255, 0); 
    glVertex3d(-1, 1, 1);
    glVertex3d(-1, 1, -1);
    glVertex3d(-1, -1, -1);
    glVertex3d(-1, -1, 1);

    //face cyan
    glColor3ub(0, 255, 255); 
    glVertex3d(1, 1, -1);
    glVertex3d(1, -1, -1);
    glVertex3d(-1, -1, -1);
    glVertex3d(-1, 1, -1);

   //face magenta
   glColor3ub(255, 0, 255); 
   glVertex3d(1, -1, 1);
   glVertex3d(1, 1, 1);
   glVertex3d(-1, 1, 1);
   glVertex3d(-1, -1, 1);

   glEnd();
   glFlush();
}

GLuint Engine::loadTexture(string file)
{
    GLuint textureID;
    if (!m_image.loadFromFile(file))
        EXIT_FAILURE;
    glGenTextures(1, &textureID);
    //glBindTexture(GL_TEXTURE_2D, textureID);
    glTexImage2D(GL_TEXTURE_2D, 0, 4, m_image.getSize().x, m_image.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_image.getPixelsPtr());
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    return textureID;
}

这是我尽可能多地修复后的地方。

PS:CODE UPDATED&图片添加

Picture of my cube

1 个答案:

答案 0 :(得分:1)

我在pastebin代码中看到两个错误:

第27行:

glBindTexture(GL_TEXTURE_2D, 0);

您无法更改glBeginglEnd来电之间的绑定纹理。您必须将纹理化面和非纹理面的渲染分割为它们自己的开始端块。

第74行:

glTexImage2D(GL_TEXTURE_2D, 0, 4, m_image.getSize().x, m_image.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, &m_image.getPixelsPtr);

最后一个参数应该是m_image.getPixelsPtr()而不是&m_image.getPixelsPtr。您正在获取该方法的地址并将其用作图像数据。如果您调用图像数据,方法getPixelsPtr将为您提供指针。

此外,您似乎正在创建新纹理并在每个帧上将图像加载到其中。如果只是在这个例子中渲染一次,那就没关系。但在实际程序中,它会对性能产生很大影响,程序很快就会耗尽内存。

可能会有更多问题,如果没有看到整个代码,就无法告诉它。如果可以,请上传一个最小的完整示例。