Отображение нескольких текстур на Кубе 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 ответ:
Я думаю, что вам нужно будет сделать каждую грань в отдельной партии:
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-текстуру.
- свяжите все текстуры в разных регистрах текстурных блоков и запишите пиксель шейдерный.