Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
1

Текстуры на куб и принцип наложения текстур

03.04.2016, 11:25. Показов 2123. Ответов 7
Метки нет (Все метки)

1. Использую VBO для отрисовки примитивов, текстурные координаты также передаются в буфер как объект VBO. При создании куба, хочу использовать индексы (как я понимаю, это самое оптимальное решение), но не знаю как правильно задать массив координат в этом случае, чтобы текстура правильно наложилась на все грани куба.
2. Еще возник вопрос насчет принципа наложения текстур.
Хочется иметь что-то типа библиотеки материалов, где собраны текстуры, уже загруженные в видео-память (чтобы не обращаться к ним несколько раз)
Как это делается на современных игровых движках?
Я делаю так:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); {Texture blends with object background}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); { only first two can be used }
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); { all of the above can be used }
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); {Texture does NOT blend with object background}
tex[0].Create:
path=...
name=...
tex[1].Create:
path=...
name=...

tex[0].Load(name):
...
Width:=...
Height:=...
pData:=...
gen*t
bind*t
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData)
glDraw*№1

tex[0].Load
Width:=...
Height:=...
pData:=...
gen*t
bind*t
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData)
glDraw*№2

Как я понимаю, сгенерировать текстуру нужно только один раз, а потом просто биндить, но у меня не выходит, поэтому использую такой способ. Причину не понимаю. Вроде бы pData - главный параметр, который должен сохраняться у объекта текстуры, чтобы потом его биндить, добавляя
bind*t
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData)
glDraw
а до этого сделать
gen*t
bind*t

Добавлено через 23 минуты
3. И еще вопрос:
Как-то я сталкивался (Minecraft) с файлом, в котором нарисованы сразу все текстуры. А при запуске накладывалась каждая текстура на свой объект. Как это делается? Как из загруженного файла выделить только те текстуры, которые нужно использовать на нужном объекте?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2016, 11:25
Ответы с готовыми решениями:

Параметры наложения текстуры
Добрый день! Столкнулся с проблемой. Не до конца получается правильно наложить текстуру с...

Текстуры способы наложения
Привет всем, народ скажите какие есть способы наложения текстур, просто ИМХО использовать GLAUX не...

Сохранить прозрачность после наложения текстуры
Есть такой код отрисовки: void __fastcall TFormMain::DrawObjects() { glEnable(GL_TEXTURE_2D);...

Как задать свой алгоритм наложения текстуры?
Доброго времени суток! Я новичёк в программировании шейдеров, есть задача выводить график сигнала...

7
2051 / 1526 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
03.04.2016, 11:44 2
Цитата Сообщение от homelleon Посмотреть сообщение
Как я понимаю, сгенерировать текстуру нужно только один раз, а потом просто биндить, но у меня не выходит, поэтому использую такой способ.
Сначала нужно сгенерировать номера текстур через glGenTextures. Он тебе даст свободные номера. Потом берешь номер, биндишь его, потом загружаешь текстуру и настраеваешь семплер. Потом точно так же обрабатываешь вторую и т.д. При отрисовке опять же биндишь нужный номер (из тех которые вернул glGenTextures)
1
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
03.04.2016, 11:46  [ТС] 3
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Сначала нужно сгенерировать номера текстур через glGenTextures. Он тебе даст свободные номера. Потом берешь номер, биндишь его, потом загружаешь текстуру и настраеваешь семплер. Потом точно так же обрабатываешь вторую и т.д. При отрисовке опять же биндишь нужный номер (из тех которые вернул glGenTextures)
Что значит Семплер? Это текстура, загруженная в память?
0
2051 / 1526 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
03.04.2016, 11:56 4
Лучший ответ Сообщение было отмечено homelleon как решение

Решение

примерно вот так:
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
// подгрузка текстуры
unsigned TGLRender::CreateTexture(HBITMAP Bitmap) {
    if (!Bitmap)
        return 0;
    unsigned ret;
    BITMAP Bmp;
    GetObject(Bitmap, sizeof(Bmp), &Bmp);
    if (!Bmp.bmBits)
        return 0;
    glGenTextures(1, &ret);
    glBindTexture(GL_TEXTURE_2D, ret);
 
    gluBuild2DMipmaps(GL_TEXTURE_2D, Bmp.bmBitsPixel / 8, Bmp.bmWidth,
        Bmp.bmHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, Bmp.bmBits);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
        GL_LINEAR_MIPMAP_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
        GL_LINEAR_MIPMAP_LINEAR);
    return ret; // возвращаем сгенерированый Id (по терминологии GL - имя) текстуры
 
};
// бинд текстуры.
void TGLRender::SelectTexture(int Id) {
    if (Id) {
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, Id);
    }
    else {
        glDisable(GL_TEXTURE_2D);
    }
};
Добавлено через 2 минуты
Цитата Сообщение от homelleon Посмотреть сообщение
Что значит Семплер?
Фильтры магнификации и минификации.
C++
1
2
3
4
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
        GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
        GL_LINEAR_MIPMAP_LINEAR);
Добавлено через 3 минуты
Цитата Сообщение от homelleon Посмотреть сообщение
Как это делается? Как из загруженного файла выделить только те текстуры, которые нужно использовать на нужном объекте?
Он не для того делается. А для ттого чтобы один раз загрузить одну текстуру и больше с менеджментом текстур не связываться. НУ а дальше либо у объекта хитрым способом расстовляются текстурные координаты (с учетом смещения), либо для каждого объекта указываются смещения координат в семплере текстуры, либо аналогичная коррекция текстурных координат производится в шейдере, по номеру текстуры наложенной на конкретный экземпляр объекта.
1
22 / 24 / 2
Регистрация: 04.08.2015
Сообщений: 597
03.04.2016, 21:58 5
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Сначала нужно сгенерировать номера текстур через glGenTextures. Он тебе даст свободные номера. Потом берешь номер, биндишь его, потом загружаешь текстуру и настраеваешь семплер. Потом точно так же обрабатываешь вторую и т.д. При отрисовке опять же биндишь нужный номер (из тех которые вернул glGenTextures)
А при загрузки текстур в массив GL_TEXTURE_2D_ARRAY перебиндить не надо ведь, отдельно для каждой загружаемой текстуры? они просто загружаются следующим слоем поверх прошлой загрузки? или как это работает?

Добавлено через 11 минут
Цитата Сообщение от homelleon Посмотреть сообщение
Что значит Семплер?
Семплер это путь передачи текстуры в фрагментный шейдер.

Это когда в программе пишешь:
C++
1
2
        GLuint location = glGetUniformLocation(путь к объекту шейдерной программе, "Tex1");
        glUniform1i(location, номер канала);
А в шейдере:
C++
1
uniform sampler2D Tex1; //является первым каналом в списке, значит писать выше нужно 0
Вроде так
0
2479 / 1290 / 215
Регистрация: 26.02.2009
Сообщений: 5,581
Записей в блоге: 5
04.04.2016, 01:41 6
Про сэмплеры
Цитата Сообщение от koker007 Посмотреть сообщение
А при загрузки текстур в массив GL_TEXTURE_2D_ARRAY перебиндить не надо ведь?
Не надо.
1
2051 / 1526 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
04.04.2016, 01:43 7
Цитата Сообщение от koker007 Посмотреть сообщение
Семплер это путь передачи текстуры в фрагментный шейдер.
Семплер это набор настроек интерполятора текстуры (правил выбора теселя из текстуры - семпла). Это по большому счету совокупность настроек фильтов магнификации, минификации, нормализации координат (приведения коорднинат в диапазон 0-1) по каждой оси. Просто до OpenGL 4.5 сэмплер был привязан к конкретной текстуре, вернее входил в состав текстуры. Т.е. неудобство в чем - если нужны разные семплеры для одной и той же текстуры либо перенастраивай на каждлом шагу, либо создавай набор одинаковых текстур каждая со своими настройками семплера. С OpenGL 4.5 семплер живет сам по себе текстура сама по себе аки в DirectX. Т.е. можно произвольно комбинировать тектсуры и семплеры.
2
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
04.04.2016, 14:40  [ТС] 8
Спасибо, теперь все нормально работает. Самое главное, что я не мог понять принцип подключения текстур, пока не изучил VBO. Теперь понятно, что при бинде последующей текстуры, предыдущий бинд текстуры аннулируется.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2016, 14:40

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Накладывание текстур на куб
Всем доброго времени суток! Обучаюсь OpenGL по урокам NeHe. После одного из уроков получил такой...

Библиотека текстур - накладываются текстуры друг на друга
Текстуры накладываются друг на друга. Какой параметр отвечает за то, чтобы разные текстуры были в...

Текстуры не накладываются на куб
Добрый день! делаю лабораторную по компьютерной графике и не могу понять где ошибка. текстуры не...

Нарисовать куб, используя кубические текстуры
Не получается нарисовать куб, с кубическими текстурами. Точнее куб рисуется, но чёрный. Сначала...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.