首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >skybox纹理未在opengl中显示

skybox纹理未在opengl中显示
EN

Stack Overflow用户
提问于 2013-12-11 18:49:45
回答 1查看 1.4K关注 0票数 0

我有一个简单的skybox

代码语言:javascript
复制
#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() {};
};

我在方法devIL loadTextures中使用loadTextures库加载纹理。

代码语言:javascript
复制
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

代码语言:javascript
复制
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中呈现它。

代码语言:javascript
复制
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

代码语言:javascript
复制
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();
};

当我画其他物体时,可以看到天窗看起来是黑色的。

有什么问题吗?为什么是黑色的?

编辑,我已经添加了项目,以防有人决定用更多的细节来研究问题。有项目和glm,assimp,魔鬼,自由职业者。项目尚未完成,但应该能工作。

http://www.filedropper.com/task

EN

回答 1

Stack Overflow用户

发布于 2013-12-12 01:35:55

绘制天窗有两种策略:

  • 使用天窗“清除”:你画天空框作为你的场景中的第一件事。在绘制skybox调用glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE);之前,然后绘制skybox并根据需要重新启用深度测试(glEnable(GL_DEPTH_TEST))和深度写入(glDepthMask(GL_FALSE))
  • 在最后一次不透明之后,但在混合几何图形之前绘制天框(需要支持深度夹紧)。清除场景,将深度缓冲区清除到(pow(2, b)-1.)/pow(2, b),其中b是深度缓冲区的位深度。像往常一样画出不透明的场景。启用深度夹紧和深度测试,将深度测试函数设置为更大或等于(glDepthFunc(GL_GEQUAL)),并设置一个投影,或缩放天窗,这样天空盒四元将始终保持在后面的远剪裁平面。由于深度夹紧所生成的片段深度,所有的be 1.0都通过了深度测试,仅在屏幕的那些区域呈现skybox,而不是其他几何学所覆盖的区域。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20527509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档