为什么纹理贴图不起作用?

时间:2013-12-21 13:34:34

标签: opengl

#include <Windows.h>
#include "glut.h"
#include "GLAUX.H"
#include <stdio.h>
GLuint texID;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glClearColor(0,0,0,0);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glMatrixMode(GL_TEXTURE);
    glLoadIdentity();
    gluLookAt(10,10,10,0,0,0,0,0,1);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D,texID);
    glColor3f(0.9f,0.9f,0.9f);
    glBegin(GL_QUADS);
    glTexCoord2f(0.f,0.f);
    glVertex3f(-100.0f, 0.0f, -100.0f);
    glTexCoord2f(0.f,1.f);
    glVertex3f(-100.0f,0.0f,100.0f);
    glTexCoord2f(1.f,1.f);
    glVertex3f(100.0f,0.0f,100.0f);
    glTexCoord2f(1.f,0.f);
    glVertex3f(100.0f, 0.0f, -100.0f);
    glEnd();

    glutSwapBuffers();
}

void InitTexture()
{
    glGenTextures(1,&texID);

    AUX_RGBImageRec * image = auxDIBImageLoad("earth.bmp");
    if(!image)
        puts("image open err\n");

    glBindTexture(GL_TEXTURE_2D, texID);
    //  glTexImage2D(GL_TEXTURE_2D, 0, 3, image->sizeX,image->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,
    //      image->data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image->sizeX, image->sizeY, GL_RGB, GL_UNSIGNED_BYTE,image->data);
    delete image->data;
    delete image;
    image = NULL;
}
void reshape (int w, int h) {
    float ratio = w/(float)h;
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45,ratio,10,1000);
}
int main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);
    glutInitWindowSize(500,500);

    glutCreateWindow("3D FORTRESS");
    InitTexture();
    glClear(GL_COLOR_BUFFER_BIT);
    glutDisplayFunc(display);
    glutIdleFunc (display);
    glutReshapeFunc (reshape);


    glutMainLoop();
    return 0;
}

我正在尝试制作一个简单的纹理映射..

但它根本不起作用。它只显示黑屏。虽然它很好地读取了bmp文件......

1 个答案:

答案 0 :(得分:2)

此代码存在一些问题:

    glClearColor之后
  • glClear没有任何效果(直到下次通过显示功能)。
  • 您正在使用glMatrixMode(GL_TEXTURE);切换到纹理矩阵,但随后将视图矩阵加载到其中。如果您刚开始使用OpenGL,纹理矩阵不是您应该使用的;这应该是GL_MODELVIEW
  • gluBuild2DMipmaps的第一个参数必须是GLU_TEXTURE_2D
  • 您没有查看gluBuild2DMipmaps
  • 的返回值
  • 您没有检查任何OpenGL错误。使用glGetError()查明任何问题的根源。

一般来说,遇到这样的问题,请先通过注释掉功能来缩小范围。在这里,我首先绘制一个没有任何纹理的彩色四边形,然后将纹理添加到它。