Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/47: Рейтинг темы: голосов - 47, средняя оценка - 4.74
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731

Загрузка текстур в программу

17.03.2016, 14:03. Показов 9040. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, в общем не понимаю как загрузить в программу текстуру, допустим она находится по пути "texture/textur01.jpg" относительно исполняемого файла программы, так вот как данные этой текстуры занести в какой нибудь массив программы чтобы потом этот массив можно было указать допустим в функции glTexImage2D(-1-,-2-,-3-,-4-,-5-,-6-,-7-,-8-,massiv_s_texturoy).

Может есть для этого какие нибудь специальные библиотеки?
Или может подскажете что почитать касательно этого?
А то где не рассказывается как накладывать текстуры, предполагается что данные текстуры уже есть в программе, в каком нибудь массиве.

И к слову шейдеры я тоже не загружал, их встроил в виде текста в исполняемом файле а не в дополнительном каком нибудь отдельном txt.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2016, 14:03
Ответы с готовыми решениями:

Загрузка текстур
помогите! я в замешательстве! когда загружаю текстуры - все белое! что не так? помогите! срочно вот главный код code.cpp #include...

Загрузка текстур
Подскажите способы загрузки текстур, я знаю только один способ auxDIBImageLoad, но он я так понимаю самый примитивный, формат только бмп,...

Загрузка текстур
Здравствуйте. Вылетает с ошибкой сегментации. Подскажите причину, пожалуйста. #include <windows.h> #include...

7
 Аватар для globalhost
32 / 24 / 7
Регистрация: 01.08.2014
Сообщений: 115
17.03.2016, 17:07
SOIL
http://www.lonesock.net/soil.html
0
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
18.03.2016, 15:34  [ТС]
Эта библиотека не обновляется ведь? написано что последнее обновление было в 2008.. давно...

Добавлено через 9 часов 9 минут
Soil подходит для OpenGL версии 4+?
Покажите пожалуйста как вы его используете. А то не понятно же, хоть на сайте который вы дали и описывается загрузка.
Не понятно как именно она загружается, ну в том плане, порядок пикселей какой и как они представлены там, когда уже загружены.
0
 Аватар для globalhost
32 / 24 / 7
Регистрация: 01.08.2014
Сообщений: 115
18.03.2016, 16:04
Как вариант,

DevIL
http://openil.sourceforge.net/

Magick++
http://www.imagemagick.org/Magick++/


P.S. Знакомство с DevIL закончилось ошибкой при вызове ilinit() под виндой; Magick++ не удалось установить в Ubuntu из-за graphicsmagick-libmagick-dev-compat в зависимостях. С тех пор работаю с SOIL.


Добавлено через 4 минуты


C++
1
#include <SOIL/SOIL.h>
C++
1
2
3
4
5
6
// Загрузка текстуры.
GLuint tex_2d = SOIL_load_OGL_texture
(
    "textures/object.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID,
    SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
);
C++
1
glBindTexture(GL_TEXTURE_2D, tex_2d);
Добавлено через 3 минуты
Цитата Сообщение от koker007 Посмотреть сообщение
Soil подходит для OpenGL версии 4+?
Не знаком с 4+. Не могу сказать.

Добавлено через 7 минут
Цитата Сообщение от koker007 Посмотреть сообщение
как они представлены там, когда уже загружены
Функция SOIL_load_OGL_texture() генерирует и возвращает идентификатор типа GLuint. Затем перед отрисовкой передаю в его в качестве аргумента в glBindTexture.
0
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
20.03.2016, 18:01  [ТС]
В общем решил использовать DevIL который еще OpenIL называют, но не получается загрузить текстуру.
Ошибка "IL_COULD_NOT_OPEN_FILE"
По описанию ошибки он либо файл не нашел либо не смог открыть т.к. он уже где-то открыт, но он точно не открыт так что ошибка скорей всего в том что он его не находит, почему?

Файл с текстурой называется "OB_karts.jpg" и лежит в папке с исполняемым файлом запускаемой программы.
Название имени файла передается в функцию ilLoadImage().
C++
1
ilLoadImage("OB_karts.jpg");
по какой-то причине файла он не видит.. почему?

P.S. Ранее он ругался на эту же строчку, что: "аргумент типа const char* не совместим с параметром типа const wchar_t" по этому я отключил юникод. Может ли в этом причина быть? И если причина в этом то как тогда передать имя файла правильно? чтобы не ругался он потом.
0
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
21.03.2016, 09:12  [ТС]
Функцию
C++
1
ilLoadImage("OB_karts.jpg")
Заменил на
C++
1
ilLoad(IL_JPG,"OB_karts.jpg")
Вернул юникод. чтобы не возмущался приставил "L" с началу имени. Теперь:
C++
1
ilLoad(IL_JPG,L"OB_karts.jpg")
Программа собирается, но Openil изображение не получает, все таже ошибка: IL_COULD_NOT_OPEN_FILE



Вот полный код для полноты картины
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
//Структура текстуры
struct TextureImage
{
    GLubyte *imageData;
    GLuint byte_one_pixel;
    GLuint width, height;
    GLuint textureID;
    GLuint typeData;
};
TextureImage OB_karts;
 
//Функция загрузки текстуры
void LoadTexture(wchar_t *filename, TextureImage *texture) {
    ilGenImages(1, &texture->textureID);
    ilBindImage(texture->textureID);
    ilLoad(IL_JPG, filename);
 
    int err = ilGetError(); //Проверка на ошибку
    if (err != IL_NO_ERROR) {
        fprintf(stderr, "Error 010: ");
        if (err == IL_INVALID_ENUM) {
            fprintf(stderr, "IL_INVALID_ENUM ");
        }
        if (err == ILU_INVALID_ENUM) {
            fprintf(stderr, "ILU_INVALID_ENUM ");
        }
        if (err == ILUT_INVALID_ENUM) {
            fprintf(stderr, "ILUT_INVALID_ENUM ");
        }
        if (err == IL_OUT_OF_MEMORY) {
            fprintf(stderr, "IL_OUT_OF_MEMORY ");
        }
        if (err == ILU_OUT_OF_MEMORY) {
            fprintf(stderr, "ILU_OUT_OF_MEMORY ");
        }
        if (err == ILUT_OUT_OF_MEMORY) {
            fprintf(stderr, "ILUT_OUT_OF_MEMORY ");
        }
        if (err == IL_FORMAT_NOT_SUPPORTED) {
            fprintf(stderr, "IL_FORMAT_NOT_SUPPORTED ");
        }
        if (err == IL_INTERNAL_ERROR) {
            fprintf(stderr, "IL_INTERNAL_ERROR ");
        }
        if (err == ILU_INTERNAL_ERROR) {
            fprintf(stderr, "ILU_INTERNAL_ERROR ");
        }
        if (err == IL_INVALID_VALUE) {
            fprintf(stderr, "IL_INVALID_VALUE ");
        }
        if (err == ILU_INVALID_VALUE) {
            fprintf(stderr, "ILU_INVALID_VALUE ");
        }
        if (err == ILUT_INVALID_VALUE) {
            fprintf(stderr, "ILUT_INVALID_VALUE ");
        }
        if (err == IL_ILLEGAL_OPERATION) {
            fprintf(stderr, "IL_ILLEGAL_OPERATION ");
        }
        if (err == ILU_ILLEGAL_OPERATION) {
            fprintf(stderr, "ILU_ILLEGAL_OPERATION ");
        }
        if (err == ILUT_ILLEGAL_OPERATION) {
            fprintf(stderr, "ILUT_ILLEGAL_OPERATION ");
        }
        if (err == IL_ILLEGAL_FILE_VALUE) {
            fprintf(stderr, "IL_ILLEGAL_FILE_VALUE ");
        }
        if (err == IL_INVALID_FILE_HEADER) {
            fprintf(stderr, "IL_INVALID_FILE_HEADER ");
        }
        if (err == IL_INVALID_PARAM) {
            fprintf(stderr, "IL_INVALID_PARAM ");
        }
        if (err == ILU_INVALID_PARAM) {
            fprintf(stderr, "ILU_INVALID_PARAM ");
        }
        if (err == ILUT_INVALID_PARAM) {
            fprintf(stderr, "ILUT_INVALID_PARAM ");
        }
        if (err == IL_COULD_NOT_OPEN_FILE) {
            fprintf(stderr, "IL_COULD_NOT_OPEN_FILE ");
        }
        if (err == ILUT_COULD_NOT_OPEN_FILE) {
            fprintf(stderr, "ILUT_COULD_NOT_OPEN_FILE ");
        }
        if (err == IL_INVALID_EXTENSION) {
            fprintf(stderr, "IL_INVALID_EXTENSION ");
        }
        if (err == IL_FILE_ALREADY_EXISTS) {
            fprintf(stderr, "IL_FILE_ALREADY_EXISTS ");
        }
        if (err == IL_OUT_FORMAT_SAME) {
            fprintf(stderr, "IL_OUT_FORMAT_SAME ");
        }
        if (err == IL_STACK_OVERFLOW) {
            fprintf(stderr, "IL_STACK_OVERFLOW ");
        }
        if (err == ILUT_STACK_OVERFLOW) {
            fprintf(stderr, "ILUT_STACK_OVERFLOW ");
        }
        if (err == IL_STACK_UNDERFLOW) {
            fprintf(stderr, "IL_STACK_UNDERFLOW ");
        }
        if (err == ILUT_STACK_UNDERFLOW) {
            fprintf(stderr, "ILUT_STACK_UNDERFLOW ");
        }
        if (err == IL_INVALID_CONVERSION) {
            fprintf(stderr, "IL_INVALID_CONVERSION ");
        }
        if (err == IL_LIB_JPEG_ERROR) {
            fprintf(stderr, "IL_LIB_JPEG_ERROR ");
        }
        if (err == IL_LIB_PNG_ERROR) {
            fprintf(stderr, "IL_LIB_PNG_ERROR ");
        }
        if (err == IL_UNKNOWN_ERROR) {
            fprintf(stderr, "IL_UNKNOWN_ERROR ");
        }
        if (err == ILUT_NOT_SUPPORTED) {
            fprintf(stderr, "ILUT_NOT_SUPPORTED ");
        }
        fprintf(stderr, "\n");
    }
 
    //Параметры текстуры
    texture->width  = ilGetInteger(IL_IMAGE_WIDTH); // Ширина
    texture->height = ilGetInteger(IL_IMAGE_HEIGHT);// Высота
    texture->byte_one_pixel = ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL); //Количетсво байт на один пиксель
 
    //Загрузка данных в текстуру
    texture->imageData = ilGetData(); //данные
    ilEnable(IL_CONV_PAL);
    texture->typeData = ilGetInteger(IL_IMAGE_FORMAT);//Тип данных
 
 
}
 
//Высвобождение текстуры
void FreeTexture(TextureImage *texture) {
 
}
 
//Функция реализующая загрузку текстур
void Texture_game() {
    wchar_t FileName[] = L"OB_karts.jpg";
    LoadTexture(FileName, &OB_karts);
 
};
0
 Аватар для хороший Андрюша
0 / 0 / 3
Регистрация: 23.03.2016
Сообщений: 26
25.03.2016, 18:49
Попробуй использовать библиотеку glaux.h... Правда текстура должна быть формата bmp (ничего страшного, если сохранить как 24-разрядный рисунок) и иметь размеры: 16x16, 64x64, 256x256.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//main.cpp
#include <GL/glut.h>
#include <GL/glaux.h>
 
#include "function.h"
 
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glLoadIdentity();
 
    glBegin( GL_QUADS );
        glTexCoord2f( 1.0, 0.0 ); glVertex2f( -300, -300 );
        glTexCoord2f( 1.0, 1.0 ); glVertex2f( -300,  300 );
        glTexCoord2f( 0.0, 1.0 ); glVertex2f(  300,  300 );
        glTexCoord2f( 0.0, 0.0 ); glVertex2f(  300, -300 );
    glEnd(); 
    //glTexCoord2f() значения можно писать в любом порядке
}
 
void initialize()
{
    LoadTextures(); // функция, которая будет загружать текстуру
    glEnable( GL_TEXTURE_2D ); // тип текстуры
    glEnable( GL_DEPTH_TEST ); // тест глубины, чтобы текстура правильно отображалась на кубе
    glMatrixMode( GL_PROJECTION );
    glOrtho( -600, 600, -600, 600, -1200.0, 1200.0 );
    glMatrixMode( GL_MODELVIEW );
}
 
int main ( int argc, char **argv )
{
    setlocale( 0, "" );
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize( 600, 600 );
    glutInitWindowPosition( 450, 30 );
    glutCreateWindow( "unnamed" ); 
    initialize();
    
    glutDisplayFunc( display );
    glutMainLoop();
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//function.h
void LoadTextures()
{
    AUX_RGBImageRec 
        *texture1 = auxDIBImageLoadA( "...\unnamed1.bmp" ), 
      //*texture2 = auxDIBImageLoadA( "...\unnamed2.bmp" );   
        
    glGenTextures( 1, &texture[ 0 ] ); 
    
    glBindTexture( GL_TEXTURE_2D, texture[ 0 ] );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexImage2D( GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture1->data );
 
   /*
    2-ая текстура
    glBindTexture( GL_TEXTURE_2D, texture[ 1 ] );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexImage2D( GL_TEXTURE_2D, 0, 3, texture2->sizeX, texture2->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture2->data );
    */
}
По сути ничего сложного в этом коде нет.
0
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
26.03.2016, 16:36  [ТС]
С темой загрузки текстур в программу мне помогли тут IlLoadImage возвращает ошибку, что указанный файл не найден. "IL_COULD_NOT_OPEN_FILE"
Тема закрыта, вопрос решен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.03.2016, 16:36
Помогаю со студенческими работами здесь

Загрузка текстур в OpenGL
Здравствуйте. У меня вот такая проблема: Мне нужно загрузить текстуру. Раньше пользовался для этого функцией glTexImage2D, которой...

Загрузка текстур в Java
Необходимо загрузить некую текстуру. С горем пополам конвертировал картинку в массив байт, но всё равно выдает ошибку. Вот код: void...

Загрузка текстур OpenGL
Прошу помощи.В программе с библиотеками OpenGL загружаются картинки PNG размером только 32 X 32.Если картинка больше,то не...

Загрузка не квадратных текстур
Доброе время суток. Проблема заключается в том, что OpenGL как известно, отказывается адекватно воспринимать разрешения текстур не равное...

Загрузка текстур на obj модельку
Здравствуйте, есть obj моделька, которую я экспортировал из блендера с uv текстурками. Так вот, как загружать эти самые текстуры? Моделька...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru