我无法在四边形上显示纹理

时间:2014-10-25 11:06:54

标签: opengl freeimage

我正在尝试在四边形上包裹纹理。 我看到的只是一个白色矩形:

enter image description here

加载我使用freeimage的纹理。
我需要帮助才能修复这个非常简单的演示:

#include <GL/glut.h>
#include <GL/gl.h>
#include <FreeImage.h>
#include <stdio.h>

GLfloat coordinates[] =
{
    -0.5, 0.5, 1,
    -0.5, -0.5, 0,
    0.5, -0.5, 0,
    0.5, 0.5, 0
};

GLfloat texCoords[] =
{
    0, 1,
    0, 0,
    1, 0,
    1, 1
};

BYTE* data;

FIBITMAP* bitmap;
GLuint texture;

void initGlutCallbacks();
void initGL();
void onReshape(int w, int h);
void display();
FIBITMAP* loadTexture(const char* fileName);

int main(int argc, char** argv){

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(512, 512);
    glutInitWindowPosition(64, 64);
    glutCreateWindow("arrays");

    initGlutCallbacks();
    initGL();

    // texture
    bitmap = loadTexture("rufol.png");

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    data = FreeImage_GetBits(bitmap);
    glTexImage2D(
        GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0,
        GL_RGBA8, GL_UNSIGNED_BYTE,
        data
    );

    // enable arrays
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    // specifying data for the arrays
    glVertexPointer
    (
        3, GL_FLOAT, 0, coordinates
    );

    glTexCoordPointer
    (
        2, GL_FLOAT, 0, texCoords
    );


    glutMainLoop();

}

void initGlutCallbacks(){
    glutReshapeFunc(onReshape);
    glutDisplayFunc(display);
}

void initGL(){

    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClearDepth(1.0);

    glEnable ( GL_TEXTURE_2D );

}

void onReshape(int w, int h){

}

void display(){

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE);

    glDrawArrays(GL_QUADS, 0, 4);

    glFlush();
    glutSwapBuffers();


}

FIBITMAP* loadTexture(const char* fileName){

    FIBITMAP *bitmap = FreeImage_Load(FIF_PNG, "rufol.png");
    if(bitmap == 0) printf("error loading the image\n");
    FIBITMAP *fbitmap = FreeImage_ConvertTo32Bits(bitmap);
    FreeImage_Unload(bitmap);
    return fbitmap;

}

如你所见,我甚至没有使用透视。此外还没有启用照明(我不知道是否需要显示纹理)。我已经测试了一个非常相似的代码但是为每个顶点使用颜色而不是纹理坐标并且它起作用。所以我认为加载图片时可能会出错。

1 个答案:

答案 0 :(得分:4)

您是否尝试过使用GL_RGBA代替GL_RGBA8作为第二个参数(格式)?