2012-11-21 67 views
4

我正在为OpenGL中的天空盒设计环境地图,并遇到了纹理问题。我的代码生成我想要映射的纹理的贴图,而不是一个大纹理。瓷砖也失去了大部分的分辨率,而且非常小。OpenGL中的天空盒

这里是我的代码:

#include <windows.h> 
#include <stdio.h> 
#include <glew.h> 
#include <glut.h> 
#include "Camera.h" 

Camera cam; 
GLuint texture [6]; //the array for our texture 

GLfloat angle = 0.0; 

GLuint LoadTexture(const char * filename, int width, int height) { 
    GLuint texture; 
    unsigned char * data; 
    FILE* file; 

    file = fopen(filename, "rb"); 
    if (file == NULL) return 0; 
    data = (unsigned char *)malloc(width * height * 3); 
    fread(data, width * height * 3, 1, file); 
    fclose(file); 

    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, data);  
    free(data); 
    return texture; 
}  

void FreeTexture(GLuint texture) 
{ 
    glDeleteTextures(1, &texture); 
} 

void skybox (void) { 
float x = 0; 
float y = 0; 
float z = 0; 
float width = 100; 
float height = 100; 
float length = 100; 
// Bind the BACK texture of the sky map to the BACK side of the cube 
glBindTexture(GL_TEXTURE_2D, texture[0]); 
// Center the skybox 
x = x - width/2; 
y = y - height/2; 
z = z - length/2; 
glBegin(GL_QUADS);  
    glTexCoord2f(1.0f, 0.0f); glVertex3f(x + width, y, z); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(x + width, y + height, z); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(x, y + height, z); 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y, z); 
glEnd(); 
glBindTexture(GL_TEXTURE_2D, texture[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(); 

glBindTexture(GL_TEXTURE_2D, texture[4]); 
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, texture[5]); 
glBegin(GL_QUADS);  
    glTexCoord2f(0.0f, 0.0f); glVertex3f(x + width, y + height, z); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(x + width, y + height, z + length); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(x, y + height, z + length); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(x, y + height, z); 
glEnd(); 
glBindTexture(GL_TEXTURE_2D, texture[2]); 
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, texture[3]); 
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(); 
//glBindTexture(GL_TEXTURE_CUBE_MAP, texture[0]); //bind the texture 
//glRotatef(angle, 1.0f, 1.0f, 1.0f); 
//glutSolidSphere(2, 40, 40); 
} 

void display (void) { 
glClearColor (0.0,0.0,0.0,1.0); 
glClear (GL_COLOR_BUFFER_BIT); 
glLoadIdentity(); 
cam.camera(); 
//gluLookAt (20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 
texture[0] = LoadTexture("Back.bmp", 256, 256); //load the texture 
texture[1] = LoadTexture("Front.bmp", 256, 256); //load the texture 
texture[2] = LoadTexture("Left.bmp", 256, 256); //load the texture 
texture[3] = LoadTexture("Right.bmp", 256, 256); //load the texture 
texture[4] = LoadTexture("Bottom.bmp", 256, 256); //load the texture 
texture[5] = LoadTexture("Top.bmp", 256, 256); //load the texture 
glEnable(GL_TEXTURE_2D); //enable 2D texturing 
glEnable(GL_TEXTURE_GEN_S); //enable texture coordinate generation 
glEnable(GL_TEXTURE_GEN_T); 
skybox(); 
for (int i = 0; i < 6; i++) { 
    FreeTexture(texture[i]); 
} 
glutSwapBuffers(); 
angle = angle + 0.5; 
cam.incAngle(); 
} 

void keyboard (unsigned char key, int x, int y) { 
switch (key) { 
case 'q': cam.lookUpwards(); break; 
case 'z': cam.lookDownwards(); break; 
case 'w': cam.slideForward(); break; 
case 's': cam.slideBackward(); break; 
case 'a': cam.strafeLeft(); break; 
case 'd': cam.strafeRight(); break; 
case 'e': exit(0); break; 
default: break; 
} 
} 

void reshape(int x, int y) { 
cam.reshape(x, y); 
} 

void mouseMovement(int x, int y) { 
cam.mouseMovement(x, y); 
} 

int main (int argc, char **argv) { 
glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE); 
glutInitWindowSize(500, 500); 
glutInitWindowPosition(100, 100); 
glutCreateWindow("A basic OpenGL Window"); 
glutDisplayFunc(display); 
glutIdleFunc(display); 
glutReshapeFunc(reshape); 
glutKeyboardFunc(keyboard); 
glutPassiveMotionFunc(mouseMovement); 
glutMainLoop(); 
} 
+0

这是固定功能的OpenGL,这是相当过时。请考虑使用带着色器的可编程管线。 –

+10

@StephanvandenHeuvel:请考虑回答实际问题,而不是建议OP不需要的东西。日期与否,固定功能即使在今天也有很多用途。制作GL4着色器只是为了绘制天空盒而已。 – SigTerm

+0

这个问题为什么downvoted? –

回答

2

既然要指定纹理手动坐标,您应该删除/禁用以下自动生成:

glEnable(GL_TEXTURE_GEN_S); //enable texture coordinate generation 
glEnable(GL_TEXTURE_GEN_T); 

此外,它看起来可疑,你是将.bmp文件加载为原始RGB数据。

1

颜色就会变回正常,如果我们更换GL_BGR GL_RGB包含在“glew.h”