Отображение текстуры OpenGL отключает затенение - PullRequest
1 голос
/ 01 декабря 2011

Мое текущее приложение openGL - это просто сфера и пол, с освещением и затенением, которые работают правильно.

После добавления 2d текстуры на пол с помощью учебника Redbook: http://fly.cc.fer.hr/~unreal/theredbook/chapter09.html

.. моя заливка становится отключенной.Если я отключу GL_TEXTURE_2D, все будет отображаться правильно, но текстура, очевидно, не отображается.Это известная проблема с известным обходным путем?Вот немного кода для справки:

#define    checkImageWidth 64
#define    checkImageHeight 64
GLubyte checkImage[checkImageWidth][checkImageHeight][3];

void makeCheckImage(void)
{
    int i, j, c;

       for (i = 0; i < checkImageWidth; i++) {
        for (j = 0; j < checkImageHeight; j++) {
            c = ((((i&0x8)==0)^(((j&0x8))==0)))*255;
            checkImage[i][j][0] = (GLubyte) c;
            checkImage[i][j][1] = (GLubyte) c;
            checkImage[i][j][2] = (GLubyte) c;
        }
    }
}


void initImage() {

    makeCheckImage();
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth, 
        checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, 
        &checkImage[0][0][0]);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
        GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
        GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
}

А затем грубая функция наземного рисования:

void makeGround() {

    GLfloat mat_specular[]      = { 0.5, 0.5, 0.5, 0.5 };
    GLfloat mat_diffuse[]       = { 0.3, 0.3, 0.3, 0.3 };
    GLfloat mat_shininess[]     = { 25.0 };

    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

    glColor3f(0.2, 0.2, 0.2);

    glBegin(GL_QUADS);
        glTexCoord2f(0.0, 0.0); glVertex3f(-100.0f, -1.0f, -100.0f);
        glTexCoord2f(0.0, 1.0); glVertex3f(-100.0f, -1.0f,  100.0f);
        glTexCoord2f(1.0, 1.0); glVertex3f( 100.0f, -1.0f,  100.0f);
        glTexCoord2f(1.0, 0.0); glVertex3f( 100.0f, -1.0f, -100.0f);
    glEnd();
    glFlush();

}

, если вам нужно увидеть какие-либо дополнительные части кода, простодай мне знать

1 Ответ

4 голосов
/ 01 декабря 2011
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

Декаль - странный режим окружающей среды.Для текстур GL_RGB (как у вас) он заменяет цвет.Для текстур RGBA он смешивается с альфа-версией текстуры.

Если вы просто хотите модулировать текстуру с помощью освещения, используйте GL_MODULATE

...