Проблема загрузки текстуры OpenGL с изображениями, которые пересекались друг с другом - PullRequest
0 голосов
/ 29 октября 2018

Проблемное изображение:

Problem Image

Я нашел некоторые отклонения от изображения. Я думаю, что расположение текстуры - проблема, но я не могу решить эту проблему

Мой код:

GLuint LoadTexture(const char * filename, int width, int height)

GLuint texture;
unsigned char * data;
FILE * file;

file = fopen(filename, "r");

if (file == NULL) return 0;

data = (unsigned char *)malloc(width * height * 3);
fread(data, width * height * 3, 1, file);
fclose(file);

// RGB
for (int i = 0; i < width * height; ++i)
{
    int index = i * 3;
    unsigned char B, R;
    B = data[index];
    R = data[index + 2];

    data[index] = R;
    data[index + 2] = B;
}

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); // GL_REPLACE에서 교체했음
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); // GL_CLAMP
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

return texture;

и

    glBindTexture(GL_TEXTURE_2D, texture_image[2]);
    glBlendFunc(GL_ONE, GL_ONE);
    glBegin(GL_QUADS);
    glTexCoord2i(0, 0); glVertex3f(-32, -32, 0);
    glTexCoord2i(0, 1); glVertex3f(-32, 32, 0);
    glTexCoord2i(1, 1); glVertex3f(32, 32, 0);
    glTexCoord2i(1, 0); glVertex3f(32, -32, 0);
    glEnd();

Это мой первый вопрос здесь Я не знаю, это правильно, но спасибо.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Нужно голое изображение GL_UNSIGNED_BYTE GL_RGB, и это, вероятно, не то, что это изображение. OpenGL не предоставляет никакой поддержки формата файла вообще. Вы можете сохранить файл как таковой, используя, например, GIMP, но это будет большой файл (один из таких форматов - правка: несжатое растровое изображение 24BPP, как только вы получите заголовок BMP). Более устойчивое решение - это сохранить файл в известном формате и использовать библиотеку, чтобы распаковать его. Некоторые из моих любимых,

0 голосов
/ 29 октября 2018

A Файл Windows Bitmap имеет заголовок 54 байтов. В этом заголовке указан формат закодированного файла.

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

data = (unsigned char *)malloc(width * height * 3 + 54);
fread(data, width * height * 3 + 54, 1, file);
fclose(file);

.....

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data+54);

Также обратите внимание, что по умолчанию каждая строка текстуры предполагается выровненной до 4 байтов.
В 24-битном RGB BMP-изображении каждому текселю требуется 24 бита или 3 байта, а пиксели плотно упакованы, особенно строки текстуры. Это означает, что выравнивание в 4 байта для начала строки текстуры не учитывается (за исключением того, что ширина текстуры делится на 4 без остатка).

Это не проблема в вашем случае, потому что ваша текстура имеет 64 пикселя и 64 * 3 делится на 4. Но если число байтов в строке не будет делиться на 4, вам придется изменить выравнивание до 1.

Это означает, что параметр GL_UNPACK_ALIGNMENT должен быть установлен в 1, прежде чем загружать плотно упакованную текстуру в графический процессор (glTexImage2D).
В противном случае при поиске текстуры получается смещение 0-3 байта на строку. Это приведет к непрерывно скрученной или наклонной текстуре.

glPixelStore(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data+54);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...