Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146

Текстурирование куба разными текстурами

20.01.2018, 12:10. Показов 3663. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Использую GLFW, GLSL.

Я начинающий кодер. Встал вопрос: как текстурировать куб разными текстурами? Да, я знаю, что можно собрать куб из квадратов с разными 2D текстурами, но мне интересно, есть ли более оптимальные варианты? Я знаю про CubeMap, но не знаю, насколько правильно использовать этот метод, если, например, у меня 1000 кубиков.

Насколько я проиграю в производительности, если буду рендерить по 1 квадрату поочерёдно?
Есть ли более оптимальные варианты? Как их реализовать?

Буду благодарен за любою помощь. Спасибо.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.01.2018, 12:10
Ответы с готовыми решениями:

Текстурирование куба
Здравствуйте, подскажите, как можно наложить на куб текстуру с использованием шейдеров. main.h#pragma once #include <iostream>...

Как создать куб с разными текстурами на гранях?
Т.к. на предыдущую тему я ответа не получил, то теперь я задам простой вопрос: Как создать куб у которого на каждой гране своя...

Закрасить грани куба разными цветами
Здравствуйте, интересуют несколько вопросов/нюансов связанных с OpenGL в 3D: К примеру, есть некий самый обычный куб и необходимо...

33
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
21.01.2018, 12:28  [ТС]
Если есть вопросы, требуется конкретизация или дополнительная информация - пишите, я преподнесу.
0
 Аватар для vindast
61 / 58 / 11
Регистрация: 25.04.2017
Сообщений: 509
21.01.2018, 14:58
Можешь попробывать так: добавить в буфер с кубом еще один параметр для каждого треугольника - id текстуры, и уже по этому Id выбирать текстуру и накладывать.

Добавлено через 5 минут
Мультитекстурирование скользкая тема, проще порезать модель на части по используемому материалу.
1
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
21.01.2018, 21:29  [ТС]
Цитата Сообщение от vindast Посмотреть сообщение
Можешь попробывать так: добавить в буфер с кубом еще один параметр для каждого треугольника - id текстуры, и уже по этому Id выбирать текстуру и накладывать.
Я не совсем понимаю, как выбирать id текстуры, если вершины и текстуры идут в шейдеры "разом". Или я что-то путаю. Можете пример показать?
0
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,960
Записей в блоге: 216
21.01.2018, 22:13
Цитата Сообщение от General_TaO Посмотреть сообщение
как выбирать id текстуры, если вершины и текстуры идут в шейдеры "разом".
Они будут идти разом, но в разных семплерах.

На OpenGL ES 2.0:
glSlang
1
2
3
4
5
6
7
8
9
10
11
12
precision mediump float;
 
uniform sampler2D u_Sampler0;
uniform sampler2D u_Sampler1;
varying vec2 v_TexCoord;
 
void main()
{
    vec4 color0 = texture2D(u_Sampler0, v_TexCoord);
    vec4 color1 = texture2D(u_Sampler1, v_TexCoord);
    gl_FragColor = color0 * color1;
}
1
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
21.01.2018, 22:44  [ТС]
Можно по-подробнее, как это работает? Мне не понятно, почему умножение.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
gl_FragColor = color0 * color1;
0
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,960
Записей в блоге: 216
21.01.2018, 23:19
Цитата Сообщение от General_TaO Посмотреть сообщение
Можно по-подробнее, как это работает? Мне не понятно, почему умножение.
Умножение здесь для примера.

При умножении текселей этой текстуры:
Название: sky.JPG
Просмотров: 106

Размер: 9.8 Кб

на тексели этой текстуры:
Название: circle.gif
Просмотров: 106

Размер: 19.7 Кб

получается такой результат:
Название: Result.png
Просмотров: 106

Размер: 68.2 Кб
1
1959 / 815 / 114
Регистрация: 01.10.2012
Сообщений: 4,751
Записей в блоге: 2
22.01.2018, 11:57
Кстати о CubeMap. В примерах что я видел она используется как карта отражения/преломления (reflection/refraction map), т.е. UV координаты игнорируются и цвет текстуры в точке зависит от позиции камеры. В данном случае это не нужно, хочется получить тот же рез-т что и для "6 текстур", только меньше возиться. Выходит CubeMap здесь никак не поможет?

Та же ситуевина с spherical. Сначала ответчик бодро заявляет что spherical в OpenGL ЕСТЬ! Но когда объясняю что нужно не отражение, а "обычная" текстура - начинается чесание репы и что-то мутное типа "ну можно сделать", а чаще вообще молчок.

Цитата Сообщение от vindast Посмотреть сообщение
Можешь попробывать так: добавить в буфер с кубом еще один параметр для каждого треугольника - id текстуры, и уже по этому Id выбирать текстуру и накладывать.
Ну наверное в шейдере найти стенку куба по нормали к фейсу все-таки проще и быстрее (хотя все равно возня)
1
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,372
Записей в блоге: 6
22.01.2018, 14:41
Для версии OpenGL 3.3 можно отрисовать 1000 кубов за 1 вызов с разными картинками для каждой грани, но ограничение по формату и разрешению текстур (они должны быть одинаковыми https://www.khronos.org/opengl/wiki/Array_Texture ).
glSlang
1
2
3
4
5
6
7
8
9
10
11
12
#version 330 core
 
uniform sampler2DArray u_Sampler0;
in vec2 v_TexCoord;
flat in int v_index;
 
out vec4 fragcolor;
 
void main()
{
    fragcolor = texture( u_Sampler0, vec3(v_TexCoord,v_index) );
}
Кубомапы тут лишние ИМХО.
А вот инстансинг позволит сэкономить память
https://www.khronos.org/regist... nced.xhtml
http://vbomesh.blogspot.ru/201... ing-1.html
2
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
22.01.2018, 22:53  [ТС]
Спасибо за ссылки и советы. Я не совсем понимаю где и когда надо изменять индексы. Прошу продемонстрировать на примере одного или двух кубов с допущением, что уже есть VAO с загруженными вершинами и есть загруженные текстуры. Мне это очень поможет. Поможет и тем, кто будет искать решение моей проблемы.
0
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,372
Записей в блоге: 6
23.01.2018, 02:06
Цитата Сообщение от General_TaO Посмотреть сообщение
есть загруженные текстуры.
Текстуры придётся перегрузить
Кликните здесь для просмотра всего текста
Delphi
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
glGenTextures(1,@texture);
glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
// Allocate the storage. 
// Выделяем память под пачку(layerCount) текстур формата GL_RGBA8 (4 байта на пиксель)
// при width, height и layerCount = 256 это уже 64Мб (для каждой карты свои ограничения)
width := 256;
height := 256; 
layerCount := 256;// уникальных текстур
mipLevelCount :=1;// мипы пока не задействуем
glTexStorage3D(GL_TEXTURE_2D_ARRAY, mipLevelCount, GL_RGBA8, width, height, layerCount);
// Upload pixel data.
// The first 0 refers to the mipmap level (level 0, since there's only 1)
// The following 2 zeroes refers to the x and y offsets in case you only want to specify a subrectangle.
// The final 0 refers to the layer index offset (we start from index 0 and have 2 levels).
// Altogether you can specify a 3D box subset of the overall texture, but only one mip level at a time.
// Загружаем данные
// Удобнее, мне кажется, в цикле по текстурам:
format := GL_RGBA;
for i:=0 to layerCount-1 do
begin
  texels  := LoadTextureFromFile( filename[i], width, height, format );
  glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, width, height, 1, format, GL_UNSIGNED_BYTE, texels);
end;
 
// Always set reasonable texture parameters
// Настраиваем фильтрацию и прочие функции текстурных координат если нет объекта семплера.
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);


Вершин можно сделать 6*6 для одного куба, тогда текстурные координаты можно прилепить к каждой вершине куба свои.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TVertex = packed record // эта структура плотно упакована align=1
  pos:TVec3;
  uv:TVec2;
  index:integer;
end;
// остаётся заполнить N*36 таких структур, для получения N кубов
// и залить в буфер
glGenBuffers(1, @vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, N*36*sizeof(TVertex), vertexPointer, GL_STATIC_DRAW);
 
//привязать к vao можно так
glBindVertexArray( vao );
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(locPos);
glVertexAttribPointer(locPos, 3, GL_FLOAT, GL_FALSE, sizeof(TVertex), Pointer(0) );
glEnableVertexAttribArray(locUV);
glVertexAttribPointer(locUV, 2, GL_FLOAT, GL_FALSE, sizeof(TVertex), Pointer(sizeof(TVec3)) );
glEnableVertexAttribArray(locIndex);
glVertexAttribIPointer(locIndex, 1, GL_INT, sizeof(TVertex), Pointer(sizeof(TVec3)+sizeof(TVec2)));
glBindVertexArray( 0 );
Отрисовка
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
glUseProgram( prog );
glBindVertexArray( vao );
glUniform1i( locSampler, 0 );
glUniformMatrix4fv( locMatrix, 1, GL_FALSE, @u_MVP );
glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
glDrawArrays(GL_TRIANGLES, 0, N*36 );
Ну и вершинный шейдер на всякий случай
glSlang
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#version 330
 
uniform sampler2DArray u_Sampler0;
uniform mat4 u_MVP;
 
in vec4 a_pos;
in vec2 a_uv;
in int a_index;
 
out vec2 v_TexCoord;
flat out int v_index;
 
void main(){
  v_index = a_index;
  v_TexCoord = a_uv;
  gl_Position = u_MVP*a_pos;
}
1
1959 / 815 / 114
Регистрация: 01.10.2012
Сообщений: 4,751
Записей в блоге: 2
23.01.2018, 12:52
В Qt есть пример "cube" именно с разными текстурами на каждой грани. Насколько помню, смысл: все текстуры слиты в 1 имедж, но назначаются разные UV координаты для ветрексов каждой грани (удобно оттуда их списать). Думается это решение оптимально

Не по теме:


Цитата Сообщение от snake32 Посмотреть сообщение
Кубомапы тут лишние ИМХО.
Я давно уже понял что буду получать лишь такие уклончивые ответы :)

1
23.01.2018, 13:01

Не по теме:

Цитата Сообщение от Igor3D Посмотреть сообщение
Я давно уже понял что буду получать лишь такие уклончивые ответы
Шо-шо?? Я отвечал на вопрос ТС. Ваш вопрос вообще не понял.
Цитата Сообщение от Igor3D Посмотреть сообщение
Выходит CubeMap здесь никак не поможет?
Где это ЗДЕСЬ?

0
1959 / 815 / 114
Регистрация: 01.10.2012
Сообщений: 4,751
Записей в блоге: 2
23.01.2018, 13:22
Цитата Сообщение от snake32 Посмотреть сообщение
Шо-шо?? Я отвечал на вопрос ТС. Ваш вопрос вообще не понял.
Я считаю нормальным ответом примерно такой
CubeMap - это карта отражения, поэтому для данной цели
Цитата Сообщение от General_TaO Посмотреть сообщение
как текстурировать куб разными текстурами?
она вообще не подходит.
Я прав или нет? Или будем шокать и вилять типа
Цитата Сообщение от snake32 Посмотреть сообщение
Кубомапы тут лишние ИМХО.
??
0
827 / 244 / 47
Регистрация: 24.01.2013
Сообщений: 750
23.01.2018, 14:17
Цитата Сообщение от Igor3D Посмотреть сообщение
CubeMap - это карта отражения, ....
Не только "карта отражения", но и "окружения" - скай бокс типичное использование кубомапы.
Вообще смысл самой CubeMap в безшовности наложения этих 6-ти текстур.

Вот типичный шейдер для скай бокса:
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
--------------------------
#version 120
 
varying vec4 cubeCoord;
 
void main()
{
 cubeCoord = gl_ModelViewProjectionMatrixInverse * gl_Vertex;
 gl_Position = gl_Vertex;
}
 
-------------------------
 
#version 120
 
uniform samplerCube cubeMap;
 
varying vec4 cubeCoord;
 
void main ()
{
 vec3 texVal = textureCube(cubeMap, cubeCoord.xyz).rgb;
 gl_FragData[0] = vec4(texVal, 1.0);
}
думаю сами сообразите, что нужно записать в cubeCoord в вершинном шейдере, что-бы "приклеить" текстуру к модели.
1
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,372
Записей в блоге: 6
23.01.2018, 14:34
Цитата Сообщение от Igor3D Посмотреть сообщение
CubeMap - это карта отражения
Почему так грубо?
CubeMap - это кубемап - набор из 6 одинаковых текстур с оригинальной адресацией текстурных координат.
То что кубемап хорошо подходит для "карт отражения". Это не значит что "больше кубемап никуда не годится".
0
1959 / 815 / 114
Регистрация: 01.10.2012
Сообщений: 4,751
Записей в блоге: 2
24.01.2018, 09:27
Цитата Сообщение от _Develop Посмотреть сообщение
Не только "карта отражения", но и "окружения" -
А также еще и "преломления" - думается нет надобности "оглашать весь список" В любом случае она работает "от вектора" а куда (и зачем) он смотрит - зависит от создаваемого эффекта. Только вот для наложения примитивом "куб" она никак не подходит.

Цитата Сообщение от snake32 Посмотреть сообщение
То что кубемап хорошо подходит для "карт отражения". Это не значит что "больше кубемап никуда не годится".
Карта отражения - термин еще 80-х годов, стесняться его не нужно

В общем, верно ли я понимаю что наложения примитивом в OpenGL нет? Т.е. хотим наложить кубом, сферой, цилиндром - должны считать UV, а проскочить по-быстрому - никак? (моцная система)

Добавлено через 16 часов 50 минут
Еще о cubeMap

Давным-давно, (когда raytrace был еще удовольствием дорогим), чтобы получить реальные отражения делали так: выключали объект и 6 раз рендерили камерой в его центре с углом зрения 90 (т.е. каждую стенку куба). Полученную каракатицу затем применяли как кубическую карту отражения. Геморрой был изрядный на каждом кадре, да и ловилась лишь одна рекурсия (отраженный объект тоже ведь мог отражать), но за неимением лучшего... Правда если нужно было только плоское зеркало - можно было ограничиться 1 вспомогательным проходом. Что об этом слышно в OpenGL ?

Не по теме:

Цитата Сообщение от _Develop Посмотреть сообщение
думаю сами сообразите, что нужно записать в cubeCoord в вершинном шейдере, что-бы "приклеить" текстуру к модели.
Да, действительно - просто нормаль в model space, и будет приклеена. Насчет "вообще не годится" - это я погорячился :)


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

Не по теме:

Только не нормали, а саму позицию (вектор центр объекта - точка)

0
827 / 244 / 47
Регистрация: 24.01.2013
Сообщений: 750
24.01.2018, 12:04
Цитата Сообщение от Igor3D Посмотреть сообщение
Только не нормали, а саму позицию (вектор центр объекта - точка)
Да, локальные координаты модели -> cubeCoord = gl_Vertex; - текстура статично ляжет.

Не по теме:

Так планеты хорошо текстурить, что-бы не было искажений на полюсах.

0
1959 / 815 / 114
Регистрация: 01.10.2012
Сообщений: 4,751
Записей в блоге: 2
26.01.2018, 09:26
_Develop, не получается разобраться с Вашим примером. Вертексный шейдер
C++
1
2
 cubeCoord = gl_ModelViewProjectionMatrixInverse * gl_Vertex;
 gl_Position = gl_Vertex;
Матрица gl_ModelViewProjectionMatrixInverse зависит матрицы проекции и матрицы камеры (вида). Пусть мы передвинули камеру (но не повернули). Матрица камеры изменилась, следом за ней инверсная, а значит и cubeCoord. А так быть не должно, карта окружения не реагирует ни на какие движения камеры, т.е. окружение находится "бесконечно далеко", мы не можем ни придвинуться к нему ни удалиться. Где ошибка в моих рассуждениях?

Не по теме:

Никогда не слышал о встроенной(?) переменной gl_ModelViewProjectionMatrixInverse

0
827 / 244 / 47
Регистрация: 24.01.2013
Сообщений: 750
26.01.2018, 11:38
Igor3D, то скай-бокс такой "хитрый", там вместо куба или сферы рисуется треугольник, который закрывает весь экран, но с кубической текстурой и с отключенным тестом глубины. Вам это не нужно.
Попробуйте так:
C++
1
2
cubeCoord = gl_Vertex;
 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
должно работать.

Добавлено через 10 минут
Цитата Сообщение от Igor3D Посмотреть сообщение
Никогда не слышал о встроенной(?) переменной gl_ModelViewProjectionMatrixInverse
там даже такое есть )) - gl_ModelViewProjectionMatrixInverseTrans pose
вернее было в старых версиях GLSL.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2018, 11:38
Помогаю со студенческими работами здесь

Текстурирование куба
Возник вопрос как затекстурировать модель если применяются индексы. Мы создаем 8 вершин: VertexPositionTexture v1...v8 = new...

Сделать модель Box с разными текстурами на гранях
Искал, Искал, но ничего не нашёл... :cry: Помогите, как это сделать :help:

Написание игры: как создавать объекты с разными текстурами?
Спасибо всем, кто ответит мне. Вообщем я новичок, только начал Java изучать. И мне нужна помощь уже продвинутых людей в этом деле. Я...

Ребро куба. Найти объем куба и площадь его боковой поверхности
Дана длина ребра куба. Найти объем куба и площадь его боковой поверхности.

Оператор case: Вычислить объем V куба либо длину ребра куба a
Вычислить объем V куба, если задана длина его ребра a, либо длину ребра куба a, если задан его объем V.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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