2013-12-11 103 views
0

我有一个简单的skybox天空盒纹理不显示在opengl

#include <GL/glew.h> 
#include <GL/freeglut.h> 
#include <vector> 
#include <iostream> 

#include "texture.h" 
#include "deviLoader.h" 

using namespace std; 

static std::vector<GLuint> textures; 

class Skybox 
{ 
private: 
float x, y, z; 
float width, height, length; 
bool isBottomRequired; 
void rearrange(); 
void loadTextures(); 
public: 
Skybox() {}; 
Skybox(float x, 
     float y, 
     float z, 
     float width, 
     float height, 
     float length); 
void renderSkybox(); 
void setBottom(bool required); 
~Skybox() {}; 
}; 

予加载使用魔鬼LIB在方法loadTextures纹理。

void Skybox::loadTextures() 
{ 
cout<<"SKYBOX: texture loading..."; 

Texture t; 
LoadTexture(IL_BMP, "Back.bmp", &t); 
textures.push_back(t.texID); 

LoadTexture(IL_BMP, "Front.bmp", &t); 
textures.push_back(t.texID); 

LoadTexture(IL_BMP, "Bottom.bmp", &t); 
textures.push_back(t.texID); 

LoadTexture(IL_BMP, "Top.bmp", &t); 
textures.push_back(t.texID); 

LoadTexture(IL_BMP, "Left.bmp", &t); 
textures.push_back(t.texID); 

LoadTexture(IL_BMP, "Right.bmp", &t); 
textures.push_back(t.texID); 

/* 
LoadTexture(IL_BMP, "Back.bmp", &t); 
textures[0] = t.texID; 
*/ 

cout<<"SUCCESS"<<endl; 
} 

其中功能loadTexture

void LoadTexture(ILenum FileType, char *filename, Texture *texture) 
{ 
ilInit(); 
iluInit(); 

ilLoad(FileType, filename); 

int err = ilGetError(); 
if (err != IL_NO_ERROR) 
{ 
    const char* strError = iluErrorString(err); 
    cout<<strError<<" - error during loading!"<<endl; 
    return; 
} 

texture->width = ilGetInteger(IL_IMAGE_WIDTH); 
texture->height = ilGetInteger(IL_IMAGE_HEIGHT); 
texture->bpp = ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL); 

texture->imageData = ilGetData(); 

ilEnable(IL_CONV_PAL); 

unsigned int type = ilGetInteger(IL_IMAGE_FORMAT); 

glGenTextures(1, &texture->texID); 
glBindTexture(GL_TEXTURE_2D, texture->texID); 

gluBuild2DMipmaps(GL_TEXTURE_2D, texture->bpp, texture->width, texture->height, 
    type, GL_UNSIGNED_BYTE, texture->imageData); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
} 

在我main.cpp我宣布skybox对象作为一个全局变量,呈现在方法draw

Skybox skyBox; 
..... 
//part of method draw 
if (selected[7] == 1) { 
    glDisable(GL_FOG); 
    glEnable(GL_TEXTURE_2D); 
    glPushMatrix(); 
     glTranslatef(-0.2, 4, 2.3); 
     glScalef(0.15, 0.2, 0.19); 
     skyBox.renderSkybox(); 
    glPopMatrix(); 
    glDisable(GL_TEXTURE_2D); 
    if (selected[6] == 1) 
     glEnable(GL_FOG); 
} 

renderSkybox方法

void Skybox::renderSkybox() 
{ 
glBindTexture(GL_TEXTURE_2D, textures[0]); 
glBegin(GL_QUADS); 
    glTexCoord2f(1.0, 0.0); glVertex3f(x + width, y, z); 
    glTexCoord2f(1.0, 1.0); glVertex3f(x + width, y + height, z); 
    glTexCoord2f(0.0, 1.0); glVertex3f(x, y + height, z); 
    glTexCoord2f(0.0, 0.0); glVertex3f(x, y, z); 
glEnd(); 

glBindTexture(GL_TEXTURE_2D, textures[1]); 
glBegin(GL_QUADS); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(x, y, z + length); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(x, y + height, z + length); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(x + width, y + height, z + length); 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(x + width, y,z + length); 
glEnd(); 

if (isBottomRequired) 
{ 
    glBindTexture(GL_TEXTURE_2D, textures[2]); 
    glBegin(GL_QUADS); 
     glTexCoord2f(1.0f, 0.0f); glVertex3f(x, y,z); 
     glTexCoord2f(1.0f, 1.0f); glVertex3f(x, y,z + length); 
     glTexCoord2f(0.0f, 1.0f); glVertex3f(x + width, y,z + length); 
     glTexCoord2f(0.0f, 0.0f); glVertex3f(x + width, y,z); 
    glEnd(); 
} 

glBindTexture(GL_TEXTURE_2D, textures[3]); 
glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(x + width, y + height, z); 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(x + width, y + height, z + length); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(x, y + height,z + length); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(x, y + height,z); 
glEnd(); 

glBindTexture(GL_TEXTURE_2D, textures[4]); 
glBegin(GL_QUADS); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(x, y + height,z); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(x, y + height,z + length); 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y,z + length); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(x, y,z); 
glEnd(); 

glBindTexture(GL_TEXTURE_2D, textures[5]); 
glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(x + width, y,z); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(x + width, y,z + length); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(x + width, y + height,z + length); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(x + width, y + height,z); 
glEnd(); 
}; 

当我画的其他对象 - 可以看出,天空盒看起来是黑色的 enter image description here 问题是什么?为什么它是黑色的?

编辑我的情况下,如果有人决定要考虑的问题更多的细节补充项目。有项目和glm,assimp,魔鬼,freeglut libs。项目没有完成,但它应该工作。

http://www.filedropper.com/task

+0

尝试启用GL_TEXTURE_2D,然后再加载纹理。 –

+0

它也不适用于此。 – lapots

+0

它实际上加载纹理吗? – Vallentin

回答

1

有上绘制天空盒两种策略:

  • 使用空中包厢的“清算”:你画天空盒作为场景的第一件事。绘制天空盒通话glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE);之前,然后绘制天空盒和重新启用深度测试(glEnable(GL_DEPTH_TEST))和深度写入(glDepthMask(GL_FALSE))根据需要

  • 绘制天空盒后终于不透明,但混合几何体之前(需要深度夹紧支持) 。将深度缓冲区清除为(pow(2, b)-1.)/pow(2, b),清除场景,其中b是深度缓冲区的位深度。照常绘制不透明的场景。启用深度夹紧和深度测试,将深度测试功能设置为大于或等于(glDepthFunc(GL_GEQUAL))并设置投影或放大天空盒,以使天空箱四边形始终保持位于远剪裁平面后面。由于深度限制,生成的碎片深度全部为1.0,通过深度测试,仅在屏幕上的那些区域渲染天空盒,而未被其他几何体覆盖。