纹理不在OpenGL中显示

时间:2014-05-28 15:52:06

标签: opengl

无法显示我使用OpenGL绘制的三角形。当我调试我的代码时,它只出现了白色背景。任何人都可以帮助我吗?

#pragma warning(disable:4996)

#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <glut.h>
#include <SOIL.h>

const float piOver180 = 0.0174532925f;
float heading;
float xPos;
float zPos;

//declarations
GLuint filter;
GLuint texture[3];

int width = 720;
int height = 540;

void init();
void display();
void drawTriangle();
void reshape(int width, int height);

这是我的主要功能

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(width, height);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Muzeum");

    init();
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
}


void init()
{
    texture[0] = SOIL_load_OGL_texture
        (
        "wallpaper.bmp",
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
        );
    texture[1] = texture[2] = texture[0];

    if (texture[0] == 0 || texture[1] == 0 || texture[2] == 0)
    {
        printf("SOIL loading error: '%s'\n", SOIL_last_result());
        exit(0);
    }

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
}

我的显示功能

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClearDepth(1.0);
    glEnable(GL_DEPTH_TEST);

    GLfloat xTrans = -xPos;
    GLfloat yTrans = -walk - 0.25f;
    GLfloat zTrans = -zPos;
    GLfloat sceneRotY = 360.0f - yRot;

    glTranslatef(xTrans, yTrans, zTrans);

    drawTriangle();
glFlush();
    glutSwapBuffers();
}

我画三角形

void drawTriangle()
{
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glBegin(GL_TRIANGLES);

        glNormal3f(0.0f, 0.0f, 1.0f);

        glTexCoord2f(-3.0f, 0.0f);  glVertex3f(-3.0f, 0.0f, 6.0f);
        glTexCoord2f(-3.0f, 0.0f);  glVertex3f(-3.0f, 0.0f, 0.0f);
        glTexCoord2f(3.0f, 0.0f);   glVertex3f(3.0f, 6.0f, 0.0f);

        glTexCoord2f(-3.0f, 0.0f);  glVertex3f(-3.0f, 0.0f, 6.0f);
        glTexCoord2f(3.0f, 0.0f);   glVertex3f(-3.0f, 6.0f, 6.0f);
        glTexCoord2f(3.0f, 0.0f);   glVertex3f(3.0f, 6.0f, 0.0f);

    glEnd();
    glDisable(GL_TEXTURE_2D);
}

void reshape(int width, int height)
{
    glViewport(0, 0, (GLsizei)width, (GLsizei)height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(40.0f, (GLdouble)width / (GLdouble)height, 0.5f, 20.0f);

    glMatrixMode(GL_MODELVIEW);
}

我想做的是一个有纹理贴图的房间,现在这只是我的地板部分。

1 个答案:

答案 0 :(得分:1)

主要问题是您的几何体不在您的视野范围内。您的gluPerspective()调用设置投影变换,相机放置在原点上,并指向负z方向。使用近平面和远平面的值,它将显示-0.5到-20.0范围内的z值。几何体的所有z值都在0.0到6.0的范围内,因此所有几何体都在相机后面。

我尝试了大部分代码,并通过在模型视图转换中添加翻译来显示内容。例如,在display()函数的前两行之后添加一行:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -10.0f);

还有一些可能妨碍你的事情:

  • 不致电glutInit()。我想你在原始代码中有这个。
  • GL_LINEAR_MIPMAP_LINEAR不是GL_TEXTURE_MAG_FILTER的合法值。必须是GL_LINEARGL_NEARESTglGetError()是你的朋友!
  • 幸运的是,您没有启用混音,因为您的glBlendFunc()调用与白色的清晰颜色相结合,可以防止绘制任何内容。你会添加到白色,而整个白色的东西只能在洗涤剂商业广告中使用。 ;)
  • 将alpha清除为1.0,就像使用glClearColor()的最后一个参数一样,这是非常不寻常的。现在不是真的受伤了,因为你只使用RGB帧缓冲,而不是与目标alpha混合。
  • glFlush()之前glutSwapBuffers()是多余的,只会伤害表现。