Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
XRuZzz
Антикодер
1683 / 786 / 46
Регистрация: 15.09.2012
Сообщений: 2,898
1

Сложности с формированием массива с нормалями

12.07.2019, 03:42. Просмотров 1592. Ответов 58

Всем привет!

Возникли сложности с формированием буфера, в котором будут нормали.
Делаю по уроку:
https://habr.com/ru/post/333932/
Ссылка на исходник в статье:
https://learnopengl.com/code_viewer....ghting_diffuse
В этом исходнике не используются индексы для отрисовки модели в OpenGL. То есть циклически повторяются чередующееся координаты вершин и нормалей.
Я же читаю координаты нормалей, индексы вершин и нормалей из файла obj. Соответственно и буфер должен опираться, каким то образом, на индексы нормалей.
Каким образом мне загрузить данные в буфер, чтобы координаты вершин не повторялись в буфере?
Нужно ли мне индексы нормалей и текстурных координат отправлять в IBO(EBO)?
То есть к какому виду мне привести эти массивы для отправки их буфера?
Может есть примерчик с правильной укладкой этих данных?

Добавлено через 12 минут
Правда, тут есть алгоритм, как это делается:
Tutorial 9 : VBO Indexing (Filling the index buffer)
но я не уверен, что я его правильно понимаю.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2019, 03:42
Ответы с готовыми решениями:

Ошибка с формированием двумерного массива
Помогите

Манипуляция нормалями в блендере
создал mesh составлен из разных деталей, на плоских поверхностях текстура материала отображается...

TOpenGLControl. Косяк с нормалями?
При отображении фигур (куб, треугольники) с использованием компонента TOpenGLControl происходит...

Неполадки с точечным светом/нормалями
Добрый день всем! У меня проблема с реализацией точечного освещения в DX11, может я не очень хорошо...

Особенности настройки освещения при работе с нормалями
Вектор нормали к плоскости может иметь 2 направления и из-за этого портится освещение. Подскажите,...

58
Antikl
с++
507 / 357 / 172
Регистрация: 15.07.2015
Сообщений: 1,872
Завершенные тесты: 6
12.07.2019, 07:02 2
Цитата Сообщение от XRuZzz Посмотреть сообщение
То есть циклически повторяются чередующееся координаты вершин и нормалей.
ты повнимательно глянь на -, там на первый взгляд идет чередование но это не так, просто треугольники точками прикасаются друг другу, тоисть автор использует нормализированые координаты

Цитата Сообщение от XRuZzz Посмотреть сообщение
Каким образом мне загрузить данные в буфер, чтобы координаты вершин не повторялись в буфере?
продолжай читать координаты нормалей, индексы вершин и нормалей из файла obj

тут класс для загрузки с obj файла при помощи assimp
https://habr.com/ru/post/338436/
прочитай еще раз эту тему
https://habr.com/ru/post/311808/


Цитата Сообщение от XRuZzz Посмотреть сообщение
То есть к какому виду мне привести эти массивы для отправки их буфера?
в смысле ? используй assimp для загрузки моделей он сам с генерирует индексный буфер из ходя из данных модели
0
8Observer8
3378 / 1819 / 316
Регистрация: 05.10.2013
Сообщений: 5,549
Записей в блоге: 137
12.07.2019, 16:28 3
К примеру, рисуем методом GL_TRIANGLES. У каждой вершины, которая характеризуется своим индексом, свой набор атрибутов: своя координата, своя нормаль, свой цвет (если надо) и своя текстурная координата (если надо). Нарисуйте сначала объект состоящий из нескольких треугольников без загрузки из .obj. Убедитесь, что работает. Далее, сделайте точно такой же объект в 3D редакторе и экспортируйте в файл триангулированную модель. Посмотрите, что получилось, открыв файл в текстовом редакторе. Дальше загрузите этот объект так, чтобы он заменил ваш объект, который вы жёстко задали в коде, просто загрузив в массивы, из которых рисовался ваш объект из кода, данными из файла.
1
XRuZzz
Антикодер
1683 / 786 / 46
Регистрация: 15.09.2012
Сообщений: 2,898
12.07.2019, 17:06  [ТС] 4
Вроде бы уже сообразил:
1. Читаем файл Obj:
Кликните здесь для просмотра всего текста
Код
o cube
mtllib cube.mtl

v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000

vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 1.000000

vn 0.000000 0.000000 1.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 -1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000

g cube
usemtl cube
s 1
f 1/1/1 2/2/1 3/3/1
f 3/3/1 2/2/1 4/4/1
s 2
f 3/1/2 4/2/2 5/3/2
f 5/3/2 4/2/2 6/4/2
s 3
f 5/4/3 6/3/3 7/2/3
f 7/2/3 6/3/3 8/1/3
s 4
f 7/1/4 8/2/4 1/3/4
f 1/3/4 8/2/4 2/4/4
s 5
f 2/1/5 8/2/5 4/3/5
f 4/3/5 8/2/5 6/4/5
s 6
f 7/1/6 1/2/6 5/3/6
f 5/3/6 1/2/6 3/4/6

(Не знаю зачем нужно считывать "s", то ли номер, то ли название стороны)

2. Каждая ячейка "f" оказывается в такой структуре:
Haskell
1
2
3
4
5
data FaceIndex a = FaceIndex {
    _faceLocIndex :: a
  , _faceTexCoordIndex :: (Maybe a)
  , _faceNorIndex :: (Maybe a)
  } deriving (Eq,Show)
3. А дальше нужно удалить дубликаты FaceIndex?
То есть превратить:
Кликните здесь для просмотра всего текста
Код
f 1/1/1 2/2/1 3/3/1
f 3/3/1 2/2/1 4/4/1

f 3/1/2 4/2/2 5/3/2
f 5/3/2 4/2/2 6/4/2

f 5/4/3 6/3/3 7/2/3
f 7/2/3 6/3/3 8/1/3

f 7/1/4 8/2/4 1/3/4
f 1/3/4 8/2/4 2/4/4

f 2/1/5 8/2/5 4/3/5
f 4/3/5 8/2/5 6/4/5

f 7/1/6 1/2/6 5/3/6
f 5/3/6 1/2/6 3/4/6

в
Кликните здесь для просмотра всего текста
Код
1/1/1 2/2/1 3/3/1 4/4/1 3/1/2 4/2/2 5/3/2 6/4/2 5/4/3 6/3/3 7/2/3 8/1/3 7/1/4 8/2/4 1/3/4 8/2/4 2/4/4 2/1/5 8/2/5 4/3/5 4/3/5 8/2/5 6/4/5 7/1/6 1/2/6 5/3/6 3/4/6


3. Затем по такой структуре формируем информацию для каждого фрагмента:
[v1 x, v1 y, v1 z, vt1 x, vt1 y, vn1 x, vn1 y, vn1 z, v2 x, v2 y, v2 z, vt2 x, vt2 y, vn1 x, vn1 y, vn1 z, v3 x, v3 y, v3 z, vt3 x, vt3 y, vn1 x, vn1 y, vn1 z, v4 x, v4 y, v4 z, vt4 x, vt4 y, vn1 x, vn1 y, vn1 z, ... , v3 x, v3 y, v3 z, vt4 x, vt4 y, vn6 x, vn6 y, vn6 z]

А потом просто по индексам вершин нарисовать фигуру?

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

Не по теме:

Цитата Сообщение от Antikl Посмотреть сообщение
assimp
В Haskell-е нету assimp, да и существующие библиотеки для wavefront меня не устроили, поэтому я на их базе делаю свою библиотеку для чтения

0
12.07.2019, 17:06
Antikl
с++
507 / 357 / 172
Регистрация: 15.07.2015
Сообщений: 1,872
Завершенные тесты: 6
12.07.2019, 18:23 5
s это сглаживающая группа

Цитата Сообщение от XRuZzz Посмотреть сообщение
[v1 x, v1 y, v1 z, vt1 x, vt1 y, vn1 x, vn1 y, vn1 z, v2 x, v2 y, v2 z, vt2 x, vt2 y, vn1 x, vn1 y, vn1 z, v3 x, v3 y, v3 z, vt3 x, vt3 y, vn1 x, vn1 y, vn1 z, v4 x, v4 y, v4 z, vt4 x, vt4 y, vn1 x, vn1 y, vn1 z, ... , v3 x, v3 y, v3 z, vt4 x, vt4 y, vn6 x, vn6 y, vn6 z]
а масcивом нельзя сделать типа:
v[]
vn[]
vt[]
f[]

или структуру(класс) который будет хранить 3 - 2 переменных использовать массивы

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
#include <iostream>
#include <string>
 
 
struct vec3
{
     float x, y, z;
     vec3(){x = 0; y = 0; z = 0;}
     vec3(float x1, float y1, float z1){x = x1; y = y1, z = z1;}
     vec3 operator = (const vec3 & v1)
     {
         x = v1.x;
         y = v1.y;
         z = v1.z;
         return *this;
     }
};
int main()
{
  vec3 vertex[3];
  vertex[0] = vec3(3.0f, 5.0f, 4.6f);
  
  std::cout<<vertex[0].x;
   return 0;
}
Добавлено через 2 минуты
плюс к этому не забывай что в формате obj нумерация массива начинается с 1 то в некоторых языках с 0
1
XRuZzz
Антикодер
1683 / 786 / 46
Регистрация: 15.09.2012
Сообщений: 2,898
12.07.2019, 19:20  [ТС] 6
Цитата Сообщение от XRuZzz Посмотреть сообщение
3. Затем по такой структуре формируем информацию для каждого фрагмента:
[v1 x, v1 y, v1 z, vt1 x, vt1 y, vn1 x, vn1 y, vn1 z, v2 x, v2 y, v2 z, vt2 x, vt2 y, vn1 x, vn1 y, vn1 z, v3 x, v3 y, v3 z, vt3 x, vt3 y, vn1 x, vn1 y, vn1 z, v4 x, v4 y, v4 z, vt4 x, vt4 y, vn1 x, vn1 y, vn1 z, ... , v3 x, v3 y, v3 z, vt4 x, vt4 y, vn6 x, vn6 y, vn6 z]
Это то что в VBO отправится. Аналог
Кликните здесь для просмотра всего текста
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
    GLfloat vertices[] = {
        -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
         0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
         0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
         0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
        -0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
        -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
 
        -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
         0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
         0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
         0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
        -0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
        -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
 
        -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f,  0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f, -0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
 
         0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
         0.5f,  0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
         0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
         0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
         0.5f, -0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
         0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
 
        -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
         0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
         0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
         0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
        -0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
        -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
 
        -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,
         0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,
         0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
         0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
        -0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
        -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f
    };

из урока по OpenGL (https://habr.com/ru/post/333932/)
0
8Observer8
3378 / 1819 / 316
Регистрация: 05.10.2013
Сообщений: 5,549
Записей в блоге: 137
13.07.2019, 11:10 7
XRuZzz, попробуйте начать с чего-то максимально простого. Без нормалей, без текстур. Загрузите плоскость, состоящую из двух треугольников. Для каждого face'а (то есть для каждого треугольника) задайте цвет в 3D редакторе. Сохраните в .obj с материалами. Нарисуйте с помощью gl.drawArrays(gl.TRIANGLES, ..., ...)

Вот здесь реализация простого алгоритма на Python: ObjLoader.py
А здесь применение этого алгоритма: video_18_simple_light.py

Если нравится, когда очень подробно рассказывают и показывают на видео каждый шаг, то, начиная с этого видео в серии уроков показывают как загрузить объект с нормалями и текстурами из .obj: Modern OpenGL programming in Python - part 15 - obj file format

Я переписал этот загрузчик на C# и никаких неразрешимых вопросов не возникало.

1
XRuZzz
Антикодер
1683 / 786 / 46
Регистрация: 15.09.2012
Сообщений: 2,898
15.07.2019, 10:26  [ТС] 8
Мда, если дубликаты FaceIndex удалить (шаг 3), и по этим индексам формировать данные для VBO, то потом, по этим индексам и VBO фигуру уже не нарисуешь...
0
Antikl
с++
507 / 357 / 172
Регистрация: 15.07.2015
Сообщений: 1,872
Завершенные тесты: 6
15.07.2019, 16:00 9
Цитата Сообщение от XRuZzz Посмотреть сообщение
если дубликаты FaceIndex удалить
зачем это делать?
0
XRuZzz
Антикодер
1683 / 786 / 46
Регистрация: 15.09.2012
Сообщений: 2,898
15.07.2019, 23:03  [ТС] 10
Цитата Сообщение от Antikl Посмотреть сообщение
зачем это делать?
Если я правильно понял, то так народ в интернете советует, чтобы по уникальным FaceIndex-ам(этот тип данных включает в себя индекс вершины, текстуры и нормали) сформировать данные для буфера без повторов последовательности, которая, например, включает в себя координаты вершин, текстур и нормалей:
[v x, v y, v z, vt x, vt y, vn x, vn y, vn z].
То есть, чтобы было не 36 вершин, как в уроке:
Кликните здесь для просмотра всего текста
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
GLfloat vertices[] = {
        -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
         0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
         0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
         0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
        -0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
        -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
 
        -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
         0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
         0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
         0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
        -0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
        -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
 
        -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f,  0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f, -0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
 
         0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
         0.5f,  0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
         0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
         0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
         0.5f, -0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
         0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
 
        -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
         0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
         0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
         0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
        -0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
        -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
 
        -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,
         0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,
         0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
         0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
        -0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
        -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f
    };

, а 24.
0
Antikl
с++
507 / 357 / 172
Регистрация: 15.07.2015
Сообщений: 1,872
Завершенные тесты: 6
15.07.2019, 23:33 11
Так они имеют в виду про модель в формате obj(или любой другой) так как для экономии места там находятся ну якобы повторяющиеся или уникальные вершины, нормали, текстурные координаты.

А так будет повторение тех же вершин в примере модель куба, тоисть к примеру передняя плоскость 2 треугольника, боковые плоскости слева и справа по 2 треугольника они будут соприкасаться с передней плоскостью и иметь почти одинаковые вершины, так же верхняя и нижняя часть соприкасатьюся с передней.

Что бы не было повторений сделали index buffer( Element buffer), opengl иди другие api будут опираться на знания индекса находя не достающие к примеру вершины и строить с этого модель, но модель все равно будет 36 вершин, в интернету идут споры насчет этого выгодно это или нет, но это удобно я так думаю.

а face - 1 это индексация посуте тех вершин которые не хватает в obj файле мы ищем при помощи их в уже уникальных которая нам собрала программа это v n t
0
8Observer8
3378 / 1819 / 316
Регистрация: 05.10.2013
Сообщений: 5,549
Записей в блоге: 137
15.07.2019, 23:59 12
Цитата Сообщение от Antikl Посмотреть сообщение
но модель все равно будет 36 верши
Вот этот момент я не понял. Почему всё равно будет 36 вершин? Что имеется ввиду? Вот, например, кубик с цветными гранями на WebGL и TypeScript в песочнице. Здесь в массиве координат вершин определено 24 вершины:

Javascript
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
        // Create a cube
        //   v6------v5
        //  /|      /|
        // v1------v0|
        // | |     | |
        // | v7----|-|v4
        // |/      |/
        // v2------v3
 
        let vertices = new Float32Array([ // Vertex coordinates
            // v0-v1-v2-v3 front (0, 1, 2, 3)
            1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0,
            // v0-v3-v4-v5 right (4, 5, 6, 7)
            1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0,
            // v0-v5-v6-v1 up (8, 9, 10, 11)
            1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0,
            // v1-v6-v7-v2 left (12, 13, 14, 15)
            -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0,
            // v7-v4-v3-v2 down (16, 17, 18, 19)
            -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0,
            // v4-v7-v6-v5 back (20, 21, 22, 23)
            1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0
        ]);
 
        let colors = new Float32Array([ // Colors
            // v0-v1-v2-v3 front (blue)
            0.4, 0.4, 1.0, 0.4, 0.4, 1.0, 0.4, 0.4, 1.0, 0.4, 0.4, 1.0,
            // v0-v2-v4-v5 right (green)
            0.4, 1.0, 0.4, 0.4, 1.0, 0.4, 0.4, 1.0, 0.4, 0.4, 1.0, 0.4,
            // v0-v5-v6-v1 up (red)
            1.0, 0.4, 0.4, 1.0, 0.4, 0.4, 1.0, 0.4, 0.4, 1.0, 0.4, 0.4,
            // v1-v6-v7-v2 left
            1.0, 1.0, 0.4, 1.0, 1.0, 0.4, 1.0, 1.0, 0.4, 1.0, 1.0, 0.4,
            // v7-v4-v3-v2 down
            1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
            // v4-v7-v6-v5 back
            0.4, 1.0, 1.0, 0.4, 1.0, 1.0, 0.4, 1.0, 1.0, 0.4, 1.0, 1.0
        ]);
 
        let indices = new Uint8Array([ // Indices of the vertices
            0, 1, 2, 0, 2, 3,       // front
            4, 5, 6, 4, 6, 7,       // right
            8, 9, 10, 8, 10, 11,    // up
            12, 13, 14, 12, 14, 15, // left
            16, 17, 18, 16, 18, 19, // down
            20, 21, 22, 20, 22, 23  // back
        ]);
0
Antikl
с++
507 / 357 / 172
Регистрация: 15.07.2015
Сообщений: 1,872
Завершенные тесты: 6
16.07.2019, 00:45 13
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Почему всё равно будет 36 вершин?
да это так чему удивляться то, 24 это уникальные вершины, а насчет индексов OpenGL решить какую вершину отрисовать, но внутри Opengl когда он найдет все вершины их же будет 36
0
XRuZzz
Антикодер
1683 / 786 / 46
Регистрация: 15.09.2012
Сообщений: 2,898
16.07.2019, 02:38  [ТС] 14
Так в любом .obj файле 8 индексов вершин у куба, а после моих преобразований получится 24 вершины. Значит, мне из данных в .obj файле, нужно формировать новые индексы?

Добавлено через 6 минут
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Здесь в массиве координат вершин определено 24 вершины:
У вас, как раз таки, непонятно зачем 24, а не 8(например), если у вас нет нормалей.

Eсли взять по 4 вершины на грань с нормалями, получится 24.
То есть если удалить дублирующее пары вершин и нормалей из урока, где 36 вершин, то получится 24:
Кликните здесь для просмотра всего текста
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
        -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
         0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
         0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
        -0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
        -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
         0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
         0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
        -0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
        -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f,  0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
        -0.5f, -0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
         0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
         0.5f,  0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
         0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
         0.5f, -0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
        -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
         0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
         0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
        -0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
        -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,
         0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,
         0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
        -0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f


Я лишь пытаюсь понять, как должен выглядеть массив(список), который отправится в VBO, с учётом того, что будем использовать EBO(IBO).
0
Antikl
с++
507 / 357 / 172
Регистрация: 15.07.2015
Сообщений: 1,872
Завершенные тесты: 6
16.07.2019, 08:08 15
Треугольник состоит из 3 вершин x y z, у нас одна плоскость куба это 6 вершин 2 треугольника, а так как у куба 6 сторон(плоскостей) то 6(вершин) * 6(сторон) = 36 вершин у куба. То значит открыв любой файл с obj с моделью куба face должно быть 36, 8 вершин, 14 текстурных координат, 6 нормалей.

Добавлено через 14 минут
Индексы которые в obj файле нужны для генерации недостающий вершин, после не используються как индекс в EBO(IBO)
вот такие данные должны быть при использовании EBO(IBO)
vertex = -1/1/1
vertex = -1/-1/-1
vertex = -1/-1/1
vertex = -1/1/-1
vertex = 1/-1/-1
vertex = -1/-1/-1
vertex = 1/1/-1
vertex = 1/-1/1
vertex = 1/-1/-1
vertex = 1/1/1
vertex = -1/-1/1
vertex = 1/-1/1
vertex = 1/-1/-1
vertex = -1/-1/1
vertex = -1/-1/-1
vertex = -1/1/-1
vertex = 1/1/1
vertex = 1/1/-1
vertex = -1/1/-1
vertex = 1/1/-1
vertex = 1/1/1
vertex = -1/1/1
vertex = 1/-1/1
vertex = -1/1/1
normals = -1/0/0
normals = -1/0/0
normals = -1/0/0
normals = 0/0/-1
normals = 0/0/-1
normals = 0/0/-1
normals = 1/0/0
normals = 1/0/0
normals = 1/0/0
normals = 0/0/1
normals = 0/0/1
normals = 0/0/1
normals = 0/-1/0
normals = 0/-1/0
normals = 0/-1/0
normals = 0/1/0
normals = 0/1/0
normals = 0/1/0
normals = -1/0/0
normals = 0/0/-1
normals = 1/0/0
normals = 0/0/1
normals = 0/-1/0
normals = 0/1/0
texture_coordinate = 0.625/0
texture_coordinate = 0.375/0.25
texture_coordinate = 0.375/0
texture_coordinate = 0.625/0.25
texture_coordinate = 0.375/0.5
texture_coordinate = 0.375/0.25
texture_coordinate = 0.625/0.5
texture_coordinate = 0.375/0.75
texture_coordinate = 0.375/0.5
texture_coordinate = 0.625/0.75
texture_coordinate = 0.375/1
texture_coordinate = 0.375/0.75
texture_coordinate = 0.375/0.5
texture_coordinate = 0.125/0.75
texture_coordinate = 0.125/0.5
texture_coordinate = 0.875/0.5
texture_coordinate = 0.625/0.75
texture_coordinate = 0.625/0.5
texture_coordinate = 0.625/0.25
texture_coordinate = 0.625/0.5
texture_coordinate = 0.625/0.75
texture_coordinate = 0.625/1
texture_coordinate = 0.375/0.75
texture_coordinate = 0.875/0.75
indecs = 0
indecs = 1
indecs = 2
indecs = 3
indecs = 4
indecs = 5
indecs = 6
indecs = 7
indecs = 8
indecs = 9
indecs = 10
indecs = 11
indecs = 12
indecs = 13
indecs = 14
indecs = 15
indecs = 16
indecs = 17
indecs = 0
indecs = 18
indecs = 1
indecs = 3
indecs = 19
indecs = 4
indecs = 6
indecs = 20
indecs = 7
indecs = 9
indecs = 21
indecs = 10
indecs = 12
indecs = 22
indecs = 13
indecs = 15
indecs = 23
indecs = 16
0
8Observer8
3378 / 1819 / 316
Регистрация: 05.10.2013
Сообщений: 5,549
Записей в блоге: 137
16.07.2019, 09:12 16
Цитата Сообщение от Antikl Посмотреть сообщение
да это так чему удивляться то, 24 это уникальные вершины, а насчет индексов OpenGL решить какую вершину отрисовать, но внутри Opengl когда он найдет все вершины их же будет 36
Я такую информацию в литературе не встречал. Я представляю себе, что как мы загрузили 24 координаты, 24 цвета и 24 индекса, так они в памяти и будут по 24. На этот вопрос может только спецификация ответить, но это нужно искать. Интересно, описал ли в спецификации этот момент?
0
Antikl
с++
507 / 357 / 172
Регистрация: 15.07.2015
Сообщений: 1,872
Завершенные тесты: 6
16.07.2019, 09:17 17
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я представляю себе, что как мы загрузили 24 координаты, 24 цвета и 24 индекса, так они в памяти и будут по 24.
так в памяти и будет 24, при помощи индексов Opengl делает 36 вершин ну я так думаю,
0
8Observer8
3378 / 1819 / 316
Регистрация: 05.10.2013
Сообщений: 5,549
Записей в блоге: 137
16.07.2019, 09:22 18
Цитата Сообщение от XRuZzz Посмотреть сообщение
У вас, как раз таки, непонятно зачем 24, а не 8(например), если у вас нет нормалей.
Как раз таки очень даже понятно. Одна вершина может хранить только один атрибут цвета. Если вершин будет 8, то она должна будет хранить 3 цвета, а этого не может быть, потому что может быть только одит атрибут цвета у вершины, поэтому вместо 1 вершины в этом месте их должно быть 3 штуки, так как этом месте сходятся 3 грани и у каждой грани свой цвет. Вместо 8 вершин должно быть 8 * 3 = 24 вершины. Сейчас понятно?

Добавлено через 4 минуты
Цитата Сообщение от Antikl Посмотреть сообщение
так в памяти и будет 24, при помощи индексов Opengl делает 36 вершин ну я так думаю,
"делает 36" это значит, что он из одного места оперативной памяти видеокарты берёт 24 вершины, преобразовывает, делает из них больше число и обратно сохраняет в оперативной памяти видеокарты, что теперь вершинный шейдер работает с этими 36 вершинами, а 24 вершины удаляются. Так вы считаете?
0
Antikl
с++
507 / 357 / 172
Регистрация: 15.07.2015
Сообщений: 1,872
Завершенные тесты: 6
16.07.2019, 09:30 19
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Так вы считаете?
ну типа того, тоисть он берет с буфера 24 вершины их не удаляет с памяти, потом при помощи индексов проходит находя все вершины отрисовывает их
0
8Observer8
3378 / 1819 / 316
Регистрация: 05.10.2013
Сообщений: 5,549
Записей в блоге: 137
16.07.2019, 11:15 20
Цитата Сообщение от Antikl Посмотреть сообщение
ну типа того, тоисть он берет с буфера 24 вершины их не удаляет с памяти, потом при помощи индексов проходит находя все вершины отрисовывает их
Вы выше писали, что будет создано 36 вертекса, а не 24. Зачем ему создавать ещё 12 вертексов, если он может, используя индексы пройтись по 24 уже определённых вертексов? А если он действительно создаёт сам в памяти видеокарты дополнительно 12 вертексов, то по какому алгоритму он это делает? Он же не знает, какую фигуру он рисует. Вот если, например, нужно покрасить треугольники в разные цвета, то в этом случае 24 вертексов будет недостаточно, потому что нужно будет определить дополнительные вертексы с помощью индексов, так как вместо одного вертекса в углу грани куда должно быть уже 2 вертекса, так как один вертекс может хранить только один атрибут цвета, а в данном случае нужно будет два. Лучше, конечно, на примерах делать. Попробуй покрасить вершины треугольников куба в разные цвета, я тоже попробую, как время будет.
0
16.07.2019, 11:15
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2019, 11:15

Matrix3, сложности с генерацией массива
Matrix3. Даны целые положительные числа M, N и набор из M чисел. Сформировать матрицу размера M ×...

Затруднение в повышенной сложности одномерного массива
народ подскажите как делать :Дан линейный массив из 20 элементов, заполнен случайным образом из ...

Сортировка массива с ограничением по сложности алгоритма
Отсортировать массив содержащий положительные целые числа не превышающих 100000 за O(N)O(N)O(N).


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

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

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