LINUX.ORG.RU

Не пойму, откуда взять последний аргумент для glTexImage2D


0

1

Читаю OpenGL SuperBook, но диск с примерами пока нет возможности скачать. В одной статье нашел функцию, загружающую текстуру из файла:

GLuint LoadTextureRAW( const char * filename, int wrap )
{

    // open texture data
    file = fopen( filename, "rb" );
    if ( file == NULL ) return 0;

    // allocate buffer
    width = 256;
    height = 256;
    data = malloc( width * height * 3 );

    // read texture data
    fread( data, width * height * 3, 1, file );
    fclose( file );

    // allocate a texture name
    glGenTextures( 1, &texture );

    // select our current texture
    glBindTexture( GL_TEXTURE_2D, texture );
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    // select modulate to mix texture with color for shading
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );

    // when texture area is small, bilinear filter the closest mipmap
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
                     GL_LINEAR_MIPMAP_NEAREST );
    // when texture area is large, bilinear filter the first mipmap
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

    // if wrap is true, the texture wraps over at the edges (repeat)
    //       ... false, the texture ends at the edges (clamp)
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
                     wrap ? GL_REPEAT : GL_CLAMP );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
                     wrap ? GL_REPEAT : GL_CLAMP );

    // build our texture mipmaps
    gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,
                       GL_RGB, GL_UNSIGNED_BYTE, data );

    // free buffer
    free( data );

    return texture;
}

В самой программе вызвал её так:

GLuint tdata = LoadTextureRAW("tex.bmp",GL_TRUE);
  glBindTexture(GL_TEXTURE_2D,tdata);
//  glTexImage2D (GL_TEXTURE_2D, 3, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, &tdata);
На последней закомментированной строке всё вылетало. Если подставлять текстуру напрямую, компилятор ругается на создание указателя из integera`a без приведения типа.

В определении функции сказано, что это должен быть GLvoid*, т.е. пустой указатель?

Пробовал подставлять туда указатель на массив из троек float-ов(RGB-«пиксели») - тот же эффект.

Так и не нашел примера использования с загрузкой из файла

★★★★

Последний аргумент - указатель данные в формате, который устанавливается 7 и 8 параметрами.

tex.bmp надеюсь 256x256?

Kosyak ★★★★
()

tdata - это идентификатор текстуры, а не данные

jtootf ★★★★★
()

Запихните

glTexImage2D (GL_TEXTURE_2D, 3, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
в LoadTextureRAW перед free(data)

и да, я надеюсь, вы не думаете, что ваша функция загрузит картинку bmp?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

в гимпе сделал её без сжатия, 256х256 уже загрузило, правда, без lod, почему и пытаюсь сабжевую функцию применить

wingear ★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

побольше сделаю. Надо будет еще масштабирование видовой матрицы прикрутить

wingear ★★★★
() автор топика

У меня было так:

int load_texture (unsigned char *data, int w, int h) {
  GLuint tex;
  glGenTextures (1, &tex);
  if (tex == 0) {
    printf("null\n");
    return 0;
  }
  glBindTexture (GL_TEXTURE_2D, tex);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexImage2D (GL_TEXTURE_2D,0, GL_LUMINANCE,W0,H0,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,data);
  glEnable (GL_TEXTURE_2D);
  return tex;
}

pacify ★★★★★
()
Ответ на: комментарий от pacify

А в data передается память, в которую загружен файл?

wingear ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.