Неправильные цвета при загрузке текстур в OpenGL - PullRequest
3 голосов
/ 19 февраля 2012

Я пытаюсь понять, как загрузить текстуру в OpenGL, и я написал этот очень простой код:

GLuint texture;

void loadTexture() {

    GLubyte data[] = {  255,0,0,
                        0,255,0,
                        0,255,0,
                        255,0,0    };

    glGenTextures(1, &texture);

    glBindTexture(GL_TEXTURE_2D, texture);          

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);   
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);   

    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

    int chk = gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGB, 2, 2, GL_RGB, GL_UNSIGNED_BYTE, data );

    if (chk!=0) 
        printf("error code = %d\n",chk);
    else 
        printf("success\n");  

}

Я использую loadTexture() для загрузки текстуры в память.Текстура в этом примере чрезвычайно проста, но на данный момент это не имеет значения.

void drawTexturedSquare() {

    glEnable( GL_TEXTURE_2D );
    glBegin (GL_QUADS);

    glTexCoord2f (0.0, 0.0);
    glNormal3f(0, 0, 1);
    glVertex3f (0.0, 0.0, 0.0);

    glTexCoord2f (1.0, 0.0);
    glNormal3f(0, 0, 1);
    glVertex3f (10.0, 0.0, 0.0);

    glTexCoord2f (1.0, 1.0);
    glNormal3f(0, 0, 1);
    glVertex3f (10, 10, 0.0);

    glTexCoord2f (0.0, 1.0);
    glNormal3f(0, 0, 1);
    glVertex3f (0.0, 10, 0.0);

    glEnd ();
    glDisable( GL_TEXTURE_2D);

}

Я бы хотел применить эту простую текстуру к квадрату.Я вызываю функцию drawTexturedSquare() изнутри draw() функции, где я уже вызвал

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

Проблема в том, что это результат, который я получаю

enter image description here

в то время как я ожидал, что квадрат будет зеленым по главной диагонали (слева направо и снизу справа), а красный - вторичной диагональю (справа вверху и слева внизу).Может кто-нибудь объяснить, почему?

Кроме того, каждый раз, когда я запускаю программу, я получаю другой результат:

enter image description here enter image description here enter image description here enter image description here

Я не понимаю, откуда появляется этот синий ... Кто-нибудь может мне помочь?

Ответы [ 2 ]

7 голосов
/ 19 февраля 2012

Каждая строка ваших данных должна быть выровнена по 4 байта.Либо добавьте в каждую строку 0 0, либо используйте текстуру RGBA.

Если вы не хотите делать вышеупомянутое, вы можете использовать:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

Причина, по которой ваш цвет меняетсяв том, что, поскольку вы не дополняете свои строки правильно, OpenGL читает после конца массива.

0 голосов
/ 19 февраля 2012

Вы можете попробовать GL_NEAREST для GL_TEXTURE_MIN_FILTER и GL_TEXTURE_MAG_FILTER

Как и сейчас, OpenGL интерполирует между цветами, создавая градиент (поскольку ваша текстура растягивается от 2x2 до сколь угодно большого размера экрана)

Это не объясняет, почему вы каждый раз получаете разные результаты для вашей текстуры.

...