2016-08-23 3 views
1

キューブの私の顔の1つにテクスチャをロードします。他のすべての顔には、私が付けた特定の色があります。問題は、テクスチャを適用しようとすると表示されないことです。その代わりに、キューブで最後に使用されたテクスチャが適用されています。ここで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:あなたがバインドされたテクスチャを変更することはできません

27行:CODE UPDATED & PICTURE私はペーストビンコードに2つのミスを参照してください

Picture of my cube

+0

誰も助けてくれませんか? : –

答えて

1

を追加しました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を呼び出すと、画像データへのポインタが表示されます。

また、すべてのフレームで新しいテクスチャを作成してイメージを読み込んでいるようです。一度レンダリングするのがこの例の場合、それは問題ありません。しかし実際のプログラムでは、パフォーマンスに大きな影響を与え、プログラムはすぐにメモリ不足になります。

もっと問題があるかもしれませんが、コード全体を見ることなしには言えません。可能であれば、最小限の完全な例をどこかにアップロードしてください。

+0

ありがとう、私は今これを試してみます –

+0

"getPixelsPtr"メソッドでは、glTexImage2Dは&adresseを取得するために私に具体的に尋ねるか、それはうまく動作しません:( –

+0

あなたはそれを呼んでいますか?前に空の括弧()がありますか? – michalsrb

関連する問題