Я не могу отобразить текстуру на квадре

Я пытаюсь обернуть текстуру на quad. Все, что я вижу, это белый прямоугольник:

введите здесь описание изображения

Для загрузки текстуры я использовал 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;

}

Как видите, я даже не использую перспективу. Также не включено освещение (не знаю, нужно ли оно для отображения текстур). Я протестировал очень похожий код, но использовал цвета для каждой вершины вместо координат текстуры, и это сработало. Поэтому я думаю, что это может быть что-то не так при загрузке изображения.


person tuket    schedule 25.10.2014    source источник
comment
вызвать glBindTexture(GL_TEXTURE_2D, текстура); перед glDrawArrays и проверьте FIBITMAP *bitmap = FreeImage_Load(FIF_PNG, rufol.png); возвращает ноль или нет.   -  person Hakes    schedule 25.10.2014
comment
Спасибо. Я обновил код. Я представил printf для проверки, является ли растровое изображение нулевым. Ничего не печатается.   -  person tuket    schedule 25.10.2014


Ответы (1)


Вы пытались использовать GL_RGBA вместо GL_RGBA8 в качестве второго параметра (формата)?

person mar    schedule 25.10.2014
comment
Спасибо за предложение. Я только что попробовал, но ничего не происходит. - person tuket; 25.10.2014
comment
Вы также должны привязать текстуру сразу после glGenTextures. - person mar; 25.10.2014
comment
Другое дело: вы уверены, что FIBITMAP* содержит необработанные данные пикселей? Разве вы не должны использовать что-то вроде FreeImage_GetBits(bitmap)? - person mar; 25.10.2014
comment
Думаю, ты прав, @mar. Кажется, есть еще что-то, что нужно решить. Я обновлю код вопроса. - person tuket; 25.10.2014
comment
И вы можете опустить glFlush, об этом позаботится замена буферов. - person mar; 25.10.2014
comment
Изменил RGBA на RGBA8 и... теперь работает! Большое тебе спасибо! Кстати, не могли бы вы объяснить разницу между RGBA и RGBA8 и почему это не сработало? - person tuket; 25.10.2014
comment
Давайте продолжим обсуждение в чате. - person tuket; 25.10.2014
comment
RGBA8 является допустимым внутренним форматом, но не предоставляет формат данных, см. opengl.org/ SDK/docs/man/html/glTexImage2D.xhtml. Однако использование RGBA в качестве внутреннего формата (или просто 4) также должно работать. - person mar; 25.10.2014