Исключение выдается при 0x69ABF340 при загрузке изображения с помощью STBI_Image OpenGL - PullRequest
1 голос
/ 05 октября 2019

Я пытаюсь загрузить изображение .jpg в качестве фона, я загрузил его с помощью stbi_load, однако, когда я пытаюсь нарисовать текстуру, я получаю следующую ошибку: Исключение, выданное в 0x69ABF340 (nvoglv32.dll) 0xC0000005: Чтение нарушения доступаместоположение 0x0C933000. Произошло

Я попытался изменить каналы при загрузке изображения, возможно, изображение не в rgb, а в rgba, но безуспешно.

int width = 1280;
    int height = 720;
    int channels = 3;
    GLuint t;
    stbi_set_flip_vertically_on_load(true);
    unsigned char *image = stbi_load("bg.jpg",
        &width,
        &height,
        &channels,
        STBI_rgb);
    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &t);

    glBindTexture(GL_TEXTURE_2D, t);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);

    glBindTexture(GL_TEXTURE_2D, 0);

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

1 Ответ

0 голосов
/ 05 октября 2019

Параметр STBI_rgb указывает на загрузку сгенерированной текстуры с 3 цветными каналами. Это приводит к тому, что буфер изображения (image) состоит из 3 байтов на пиксель.

Но когда вы задаете двухмерное изображение текстуры с помощью glTexImage2D, тогда указанный формат равен GL_RGBA, что предполагает 4 канала и т. Д. 4 байта на пиксель.
Это приводит к тому, что буфер данных считывается за пределы. Измените параметр формата на GL_RGB, чтобы решить это.

Также обратите внимание, что по умолчанию OpenGL предполагает, что начало каждой строки изображения выровнено на 4 байта. Это связано с тем, что параметр GL_UNPACK_ALIGNMENT по умолчанию равен 4. Поскольку изображение имеет 3 цветовых канала и плотно упакован, начало строки, возможно, смещено.
Измените параметр GL_UNPACK_ALIGNMENT параметр до 1, прежде чем указывать двухмерное изображение текстуры (glTexImage2D).

Более того, текстура не является (mipmap) завершенной. Начальное значение GL_TEXTURE_MIN_FILTER составляет GL_NEAREST_MIPMAP_LINEAR. Если вы не измените его и не создадите мип-карты, то текстура не является «полной» и не будет «показана». См. glTexParameter.
Либо установите минифицирующий фильтр на GL_NEAREST или GL_LINEAR

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

, либо сгенерируйте мип-карты с помощью glGenerateMipmap(GL_TEXTURE_2D), чтобырешить проблему.

например:

glBindTexture(GL_TEXTURE_2D, t);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

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