MipMap текстурирование в OpenGL - PullRequest
       110

MipMap текстурирование в OpenGL

0 голосов
/ 02 декабря 2011

Сначала я попытался прочитать файл ppm и использовать его для моей текстуры, однако я не был уверен, в этом ли моя проблема (в чтении файлов). Поэтому я жестко закодировал маленькое изображение 4х4 (случайные цвета) и использовал его. Я до сих пор не могу заставить его работать. У кого-нибудь есть понимание?

data2, x2, y2 - все жестко закодированные свойства изображения.

glPushMatrix();

    FILE *inFile;
    char dump[3];
    int max, k = 0;

    inFile = fopen("mountains.ppm", "r");
    int x;
    int y;

        fscanf(inFile, "%s", dump);
        //printf("%s", dump);
        fscanf(inFile, "%d %d", &x, &y);


        fscanf(inFile, "%d", &max);
        int arraySize = y*(3*x);
        int data[arraySize];

        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                fscanf(inFile, "%d", &data[k++]);
                fscanf(inFile, "%d", &data[k++]);
                fscanf(inFile, "%d", &data[k++]);
            }
        }

    int data2[] = { 100 , 50, 50, 40,  30,  70, 70, 30, 40, 155, 50, 215,
                     50 , 40, 30, 60,  15,  77, 70, 70, 70,  70, 70,  70,
                     50 , 40, 30, 20, 110, 210, 20, 15, 47,  40, 40,  30,
                     15 , 40, 15, 40,  30,  40, 30, 20, 80,  80, 40,  20};

    int x2 = 4;
    int y2 = 4;


    fclose(inFile);

        glGenTextures(1,&texture);
        glBindTexture(GL_TEXTURE_2D,texture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);           

        gluBuild2DMipmaps(GL_TEXTURE_2D,3,x2,y2,GL_RGB,GL_UNSIGNED_BYTE,data2);

    glEnable(GL_TEXTURE_2D);
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
    glBindTexture(GL_TEXTURE_2D,texture);

    glTexCoord2d(0,0); glVertex3f(0,0.0,0);
    glTexCoord2d(0,1); glVertex3f(0,0.0,80);
    glTexCoord2d(1,1); glVertex3f(80,0.0,80);
    glTexCoord2d(1,0); glVertex3f(80,0.0,0);
    glDisable(GL_TEXTURE_2D);  

glPopMatrix();  

1 Ответ

5 голосов
/ 02 декабря 2011

Во-первых, загрузка текстур - это не то, что вы должны делать каждый кадр .Вы создаете текстуру один раз, а затем используете ее, когда вам нужно визуализировать с этой текстурой.Поэтому вам нужно получить код загрузки текстуры из логики рендеринга.

Далее:

gluBuild2DMipmaps(GL_TEXTURE_2D,3,x2,y2,GL_RGB,GL_UNSIGNED_BYTE,data2);

data2 - это массив int, который обычно имеет размер 4 байта,Но вы говорите OpenGL предположить, что каждые три байта данных - это пиксель, первый байт - красный, второй - зеленый и т. Д. Но ваши значения красного цвета - 4 байта.Таким образом, OpenGL не получает данные правильно.

Вам нужно определить data2 как массив GLubyte, а не массив int.

Также, никогда не используйте цифры для формата изображения (второй параметр).Мне все равно, что в спецификации сказано, что это законно;просто используйте реальный формат.Используйте GL_RGB8 вместо «3».

Наконец:

glTexCoord2d(0,0); glVertex3f(0,0.0,0);
glTexCoord2d(0,1); glVertex3f(0,0.0,80);
glTexCoord2d(1,1); glVertex3f(80,0.0,80);
glTexCoord2d(1,0); glVertex3f(80,0.0,0);

Это в значительной степени ничего не делает.Без glBegin()/glEnd() вы просто устанавливаете некоторые значения состояния.Действительно, вызов любой команды glVertex* вне пары glBegin()/glEnd() приводит к неопределенному поведению.Это, конечно, не приведет к рендерингу (или, если это произойдет, это не будет ничего полезного).

Кроме того, вы обнаружите, что вы будете более продуктивными, если вывсегда начинать с рабочего кода.Например, если вы хотите поиграть с текстурами, начните с того, что вы знаете: нарисуйте нетекстурированную форму.Как только у вас это сработает, вы знаете, что если что-то сломается, это будет только из-за вашего текстурирующего кода.

...