【问题标题】:I can't display a texture on a quad我无法在四边形上显示纹理
【发布时间】:2014-10-25 20:27:54
【问题描述】:

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

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

}

如您所见,我什至没有使用透视。也没有启用照明(我不知道是否需要显示纹理)。我已经测试了一个非常相似的代码,但是对每个顶点使用颜色而不是纹理坐标并且它有效。所以我认为加载图像时可能有问题。

【问题讨论】:

  • 调用 glBindTexture(GL_TEXTURE_2D, texture);在 glDrawArrays 之前检查 FIBITMAP *bitmap = FreeImage_Load(FIF_PNG, "rufol.png");是否返回 null。
  • 谢谢。我更新了代码。我介绍了一个 printf 来检查位图是否为空。没有打印任何内容。

标签: opengl freeimage


【解决方案1】:

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

【讨论】:

  • 感谢您的建议。我刚刚尝试过,但没有任何反应。
  • 你还必须在 glGenTextures 之后绑定纹理
  • 另一件事:您确定 FIBITMAP* 包含原始像素数据吗?你不应该使用类似 FreeImage_GetBits(bitmap) 的东西吗?
  • 我认为你是对的,@mar。似乎还有什么需要解决的。我会更新问题的代码。
  • 你可以省略 glFlush,交换缓冲区会处理它
猜你喜欢
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
相关资源
最近更新 更多