Отображение нескольких текстур на Кубе OpenGL, c++ GLFW


Итак, я использую GLFW для управления окнами, и у меня есть GLEW для управления расширениями. Я пытаюсь написать кросс-платформенную игру, которую придумал мой брат. Это карточная игра. Но, чтобы получить основы отображения текстур и рендеринга на 3D-поверхностях, я пытаюсь получить некоторые текстуры карт для отображения на сторонах Куба. Моя первая проблема была с загрузчиком TGA glfw, где только первая текстура, которая будет загружена, будет отображаться (хотя она будет отображаться правильно на каждой поверхности, которую я использовал пытается текстурировать), несмотря на использование массива указателей GLuint для glGenTextures. Затем, я нашел http://home.comcast.net/~mlyn7576/поддержка OpenGL-ТГА/, и это также, кажется, работает, но теперь только последняя загруженная текстура отображается, а отображается одна текстура на всех лицах, хотя я ссылалась только на ГЛ название это раз. Так что же я делаю не так? Я не могу понять, почему отображается только одна загруженная текстура.

Вот мой главный заголовок:

#ifndef _RPSEVOLVED_H_
#define _RPSEVOLVED_H_
#endif

#include <iostream>
#include <math.h>

#include <glglew.h>
#include <glglfw.h>
#include <stdint.h>

using namespace std;

class RPSEvolved
{
private:
    bool Running;

public:
    static RPSEvolved* instance;
    RPSEvolved();
    int OnExecute();
    GLuint cardBackId;
    GLuint bgId;
    GLuint airCardId;
    GLuint earthCardId;
    GLuint fireCardId;
    GLuint lightningCardId;
    GLuint waterCardId;

public:
    bool OnInit();
    void OnEvent(/*SDL_Event* ev*/);
    void OnLoop();
    void OnRender();
    void OnCleanup();

    //callbacks
    static void GLFWCALL OnKeyCB(int key, int action);
    static void OnWindowCloseCB();
    static RPSEvolved* GetInstance();
    void GLFWCALL OnCharCB(int key, int action);
    void GLFWCALL OnMouseWheelCB(int pos);
    void GLFWCALL OnMouseMoveCB(int x, int y);
    void GLFWCALL OnMouseButtonCB(int button, int action);
};

Вот мой код init:

#include "RPSEvolved.h"
#include "RPSE_TGA.h"

bool RPSEvolved::OnInit()
{
    if(glfwInit() == GL_FALSE)
    {
        cout << "Error initializing GLFW";
        return false;
    }

    if(glfwOpenWindow(1024, 768, 8, 8, 8, 8, 32, 32, GLFW_WINDOW) == GL_FALSE)
    {
        cout << "Error initializing GLFW";
        return false;
    }

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_NORMALIZE); //Automatically normalize normals
    glShadeModel(GL_SMOOTH);

    glMatrixMode(GL_PROJECTION);
    gluPerspective(45, 1024/768, 1, 100);
    glMatrixMode(GL_MODELVIEW);

    glfwDisable(GLFW_AUTO_POLL_EVENTS);
    glClearColor(0, 0, 0, 255);

    glfwSetWindowCloseCallback((GLFWwindowclosefun)OnWindowCloseCB);
    glfwSetKeyCallback(OnKeyCB);

    cardBackId = load_texture_TGA("images\cardBack.tga", NULL, NULL, GL_CLAMP, GL_CLAMP);
    bgId = load_texture_TGA("images\bg.tga", NULL, NULL, GL_CLAMP, GL_CLAMP);
    airCardId = load_texture_TGA("images\airCard.tga", NULL, NULL, GL_CLAMP, GL_CLAMP);
    earthCardId = load_texture_TGA("images\earthCard.tga", NULL, NULL, GL_CLAMP, GL_CLAMP);
    fireCardId = load_texture_TGA("images\fireCard.tga", NULL, NULL, GL_CLAMP, GL_CLAMP);
    lightningCardId = load_texture_TGA("images\lightningCard.tga", NULL, NULL, GL_CLAMP, GL_CLAMP);
    waterCardId = load_texture_TGA("images\waterCard.tga", NULL, NULL, GL_CLAMP, GL_CLAMP);

    return true;
}

И мой код дисплея:

#include "RPSEvolved.h"

void RPSEvolved::OnRender()
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    gluLookAt(0.0f, 5.0f, 30.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

    static float _angle = 0.0f; _angle -= 0.3f;

    glEnable(GL_TEXTURE_2D);

    glRotatef(_angle, 0.0f, 1.0f, 0.0f);

    glColor4f(1.0f, 1.0f, 1.0f, 0.0f);

    glBegin(GL_QUADS);

    glBindTexture(GL_TEXTURE_2D, cardBackId);
    glNormal3f(0.0f, 0.0f, 1.0f); // front
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(-3.0f, -5.0f, 3.0f);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(3.0f, -5.0f, 3.0f);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(3.0f, 5.0f, 3.0f);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(-3.0f, 5.0f, 3.0f);

    glBindTexture(GL_TEXTURE_2D, airCardId);

    glNormal3f(1.0f, 0.0f, 0.0f); // right
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(3.0f, -4.0f, 3.0f);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(3.0f, -4.0f, -3.0f);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(3.0f, 4.0f, -3.0f);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(3.0f, 4.0f, 3.0f);

    glBindTexture(GL_TEXTURE_2D, earthCardId);

    glNormal3f(0.0f, 0.0f, -1.0f); // back
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(3.0f, 4.0f, -3.0f);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(-3.0f, 4.0f, -3.0f);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(-3.0f, -4.0f, -3.0f);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(3.0f, -4.0f, -3.0f);

    glBindTexture(GL_TEXTURE_2D, fireCardId);

    glNormal3f(-1.0f, 0.0f, 0.0f); // left
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(-3.0f, 4.0f, -3.0f);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(-3.0f, 4.0f, 3.0f);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(-3.0f, -4.0f, 3.0f);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(-3.0f, -4.0f, -3.0f);

    glBindTexture(GL_TEXTURE_2D, lightningCardId);

    glNormal3f(0.0f, 1.0f, 0.0f); // top
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(3.0f, 4.0f, 3.0f);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(-3.0f, 4.0f, 3.0f);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(-3.0f, 4.0f, -3.0f);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(3.0f, 4.0f, -3.0f);

    glBindTexture(GL_TEXTURE_2D, waterCardId);

    glNormal3f(0.0f, -1.0f, 0.0f); // top
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(-3.0f, -4.0f, 3.0f);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(3.0f, -4.0f, 3.0f);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(3.0f, -4.0f, -3.0f);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(-3.0f, -4.0f, -3.0f);

    glEnd();

    glfwSwapBuffers();
}

Обратите внимание, что если бы Я заменил вызовы load_texture_TGA в OnInit() вызовами glfwLoadTexture2D (), то именно там я бы получил проблему отображения только первой текстуры. Что происходит, что текстуры не все показывают, как они должны?

P.S. Извините, если это действительно долго, я привык давать всю информацию, которую я мог бы считать уместной, когда прошу помощи в кодировании.
1 3

1 ответ:

Я думаю, что вам нужно будет сделать каждую грань в отдельной партии:

glBindTexture(GL_TEXTURE_2D, cardBackId);
glBegin(GL_QUADS);
// front vertices..
glEnd();

glBindTexture(GL_TEXTURE_2D, airCardId);
glBegin(GL_QUADS);
// Right vertices..
glEnd();

// Other faces...

Есть несколько альтернатив, которые позволят вам визуализировать куб в одном пакете:

  • Создайте единую текстуру со всеми гранями куба в ней. А затем введите соответствующие координаты текстуры для вершин куба. Для этого можно использовать либо 2d-текстуру, либо 3d-текстуру.
  • свяжите все текстуры в разных регистрах текстурных блоков и запишите пиксель шейдерный.