Opengl 我能';不要在四边形上显示纹理

Opengl 我能';不要在四边形上显示纹理,opengl,freeimage,Opengl,Freeimage,我正在尝试在四边形上包裹纹理。 我看到的只是一个白色矩形: 为了加载纹理,我使用了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

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

为了加载纹理,我使用了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;

}
#包括
#包括
#包括
#包括
GLfloat坐标[]=
{
-0.5, 0.5, 1,
-0.5, -0.5, 0,
0.5, -0.5, 0,
0.5, 0.5, 0
};
GLF-texCoords[]=
{
0, 1,
0, 0,
1, 0,
1, 1
};
字节*数据;
FIBITMAP*位图;
胶合结构;
void initGlutCallbacks();
void initGL();
重塑时的空洞(int w,int h);
void display();
FIBITMAP*加载纹理(常量字符*文件名);
int main(int argc,字符**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(512、512);
位置(64,64);
创建窗口(“数组”);
initGlutCallbacks();
initGL();
//质地
位图=加载纹理(“rufol.png”);
glGenTextures(1,&纹理);
glBindTexture(GL_TEXTURE_2D,纹理);
glTexParameteri(GL\u纹理\u 2D,GL\u纹理\u最小\u过滤器,GL\u最近);
数据=自由图像\获取位(位图);
glTexImage2D(
GL_纹理_2D,0,GL_RGBA,256,256,0,
GL_RGBA8,GL_无符号字节,
数据
);
//启用阵列
glEnableClientState(GL_顶点_数组);
glEnableClientState(GL_纹理_坐标_阵列);
//为数组指定数据
果冻
(
3,GL_浮点,0,坐标
);
glTexCoordPointer
(
2,GL_浮点,0,texCoords
);
glutMainLoop();
}
void initGlutCallbacks(){
GLUTREFORMEFUNC(ONREFORMATE);
glutDisplayFunc(显示器);
}
void initGL(){
glClearColor(0.0,0.0,0.0,0.0);
glClearDepth(1.0);
glEnable(GL_纹理_2D);
}
重塑时的无效(整数w,整数h){
}
无效显示(){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glTexEnvf(GL_纹理_2D,GL_纹理_环境_模式,GL_替换);
gldrawArray(GL_四边形,0,4);
glFlush();
glutSwapBuffers();
}
FIBITMAP*加载纹理(常量字符*文件名){
FIBITMAP*位图=自由图像加载(FIF_PNG,“rufol.PNG”);
如果(位图==0)printf(“加载图像时出错\n”);
FIBITMAP*fbitmap=自由图像_转换为32位(位图);
FreeImage_卸载(位图);
返回fbitmap;
}

正如你所看到的,我甚至没有使用透视法。此外,未启用照明(我不知道是否需要显示纹理)。我已经测试了一个非常类似的代码,但是使用了每个顶点的颜色,而不是纹理坐标,并且它工作正常。因此,我认为加载图像时可能有问题。

您是否尝试过使用GL\u RGBA而不是GL\u RGBA8作为第二个参数(格式)?

您是否尝试过使用GL\u RGBA而不是GL\u RGBA8作为第二个参数(格式)?

调用glBindTexture(GL\u TEXTURE\u 2D,TEXTURE);在gldrawArray之前,检查FIBITMAP*bitmap=FreeImage\u Load(FIF\u PNG,“rufol.PNG”);返回null或not。谢谢。我更新了代码。我引入了一个printf来检查位图是否为空。没有打印任何内容。请调用glBindTexture(GL_TEXTURE_2D,纹理);在gldrawArray之前,检查FIBITMAP*bitmap=FreeImage\u Load(FIF\u PNG,“rufol.PNG”);返回null或not。谢谢。我更新了代码。我引入了一个printf来检查位图是否为空。没有印刷。谢谢你的建议。我刚试过,但什么也没发生。你还必须在glgentextures之后立即绑定纹理另一件事:你确定FIBITMAP*包含原始像素数据吗?你不应该使用像FreeImage_GetBits(位图)这样的东西吗?我想你是对的,@mar。似乎还有一些问题需要解决。我将更新问题的代码。您可以省略glFlush,交换缓冲区将处理它谢谢您的建议。我刚试过,但什么也没发生。你还必须在glgentextures之后立即绑定纹理另一件事:你确定FIBITMAP*包含原始像素数据吗?你不应该使用像FreeImage_GetBits(位图)这样的东西吗?我想你是对的,@mar。似乎还有一些问题需要解决。我会更新问题的代码。你可以省略glFlush,交换缓冲区就可以了