Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
155 / 9 / 1
Регистрация: 14.08.2019
Сообщений: 768
1

Инициализация буфера с использованием glBufferSubData и нескольких массивов

05.06.2022, 21:35. Показов 1269. Ответов 6

Author24 — интернет-сервис помощи студентам
Доброго времени суток!

Пытаюсь понять, допустим, есть два массива, вершины и цвета для каждой вершины:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
float vertices[] =
{
    -0.5f, -0.5f, 0.0f,
     0.5f, -0.5f, 0.0f,
     0.0f,  0.5f, 0.0f
}; 
 
float colors[] =
{
    1.0f, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
    0.0f, 0.0f, 1.0f 
};
Как мне правильно их передать через glBufferSubData чтобы вершинный шейдер их принял?
(Хочу передавать массивы отдельно, а не один большой целиком)

C++
1
2
3
4
5
6
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
 
glBindVertexArray(VAO);
 
glBindBuffer(GL_ARRAY_BUFFER, VBO);
Дальше как?

Вершинный шейдер

glSlang
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#version 330 core
 
layout (location = 0) in vec3 aPosition;
layout (location = 1) in vec4 aColor;
 
out vec4 ourColor;
 
uniform mat4 uProjection;
 
void main()
{
    gl_Position = uProjection * vec4(aPosition, 1.0);
    ourColor = aColor;
}
И как лучше реализовывать перемещение объекта? Изменять данные вершин, вроде-бы, такое себе, но что если мне хочется изменить позицию объекта чтобы он был от начала x и y и имел другую высоту и ширину?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2022, 21:35
Ответы с готовыми решениями:

Скорость работы glBufferSubData
Собственно в чем суть вопроса. У меня есть модель, модель рисуется с VBO, модель мне хочется...

Неправильная инициализация массивов
#include <iostream> #include<time.h> #include<windows.h> #include<conio.h> using namespace...

Инициализация массивов объектов
Для целочисленной квадратной матрицы найти число элементов, больших k, и наибольший из них. При...

Инициализация и вывод массивов
Понятие - ... Пример (попроще) - ...

6
155 / 9 / 1
Регистрация: 14.08.2019
Сообщений: 768
06.06.2022, 20:37  [ТС] 2
Bump

Добавлено через 1 час 22 минуты
Если мне нужно будет увеличивать / уменьшать объект, какую матрицу из GLM лучше использовать? perspective или ortho?
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,332
06.06.2022, 20:51 3
Лучший ответ Сообщение было отмечено eXpl01TeR как решение

Решение

Прототип функции
C++
1
void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void * data);
target - GL_ARRAY_BUFFER
offset - то куда вставлять данные в буфере, в байтах
size - размер вставляемых данных, в байтах
data - сами данные

И настройка VAO
C++
1
void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer);
index - то что в вершинном шейдере помечено как location
glSlang
1
2
 layout (location = 0) in vec3  pos;
 layout (location = 1) in vec4  color;
size - размерность компонент, от 1 до 4, например для xyz будет 3 (vec3), а для rgba - 4 (vec4)
type - тип данных, GL_FLOAT
normalized - нормализованные ли данные, обычно ложь, то есть GL_FALSE
stride - шаг данных в буфере для каждой вершины, если данные плотноупакованные (то есть данные не чередуются, идут сначала геометрия для всех вершин, потом цвета и тд. иначе говоря у каждого типа данных свой буффер) то стоит указать 0
pointer - обычно оффсет для данных, в случае с плотноупакованными данными размер данных одного типа
1
155 / 9 / 1
Регистрация: 14.08.2019
Сообщений: 768
06.06.2022, 20:54  [ТС] 4
alecss131, Я где-то читал, что glBufferSubData не может выделить больше размера чем было выделено ранее. Разве перед этим не надо как-то создавать буфер указывая его размер? Или glBufferSubData сам его создаст?
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,332
06.06.2022, 20:57 5
Лучший ответ Сообщение было отмечено eXpl01TeR как решение

Решение

то есть в вашем случае
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
float vertices[] =
{
    -0.5f, -0.5f, 0.0f,
     0.5f, -0.5f, 0.0f,
     0.0f,  0.5f, 0.0f
}; 
 
float colors[] =
{
    1.0f, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
    0.0f, 0.0f, 1.0f 
};
GLuint VAO;
GLuint VBO;
 
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(colors), nullptr, GL_STATIC_DRAW);
//заполнение VBO
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(colors), colors);
//настройка VAO
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), sizeof(vertices));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindVertexArray(0);
и повторюсь для кода шейдера
glSlang
1
2
3
4
5
#version 330 core
 
layout (location = 0) in vec3 aPosition;
layout (location = 1) in vec4 aColor;
...
И один вопрос одна тема
1
155 / 9 / 1
Регистрация: 14.08.2019
Сообщений: 768
06.06.2022, 21:00  [ТС] 6
alecss131, К примеру, как этот код переделать под glBufferSubData?

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
float vertices[] =
{
    // first triangle
    x + width, y + height, 0.0f, // top right
    x + width, y, 0.0f, // bottom right
    x, y + height, 0.0f, // top left
 
    // second triangle
    x + width, y, 0.0f, // bottom right
    x, y, 0.0f, // bottom left
    x, y + height, 0.0f // top left
};
 
float colors[] =
{
    1.0f, 1.0f, 1.0f, 1.0f,
    1.0f, 0.0f, 0.0f, 1.0f,
    1.0f, 1.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f, 1.0f,
    0.0f, 1.0f, 1.0f, 1.0f,
    0.0f, 1.0f, 0.0f, 1.0f
};
 
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
 
glBindVertexArray(VAO);
 
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
 
/* Position attribute */
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), nullptr);
glEnableVertexAttribArray(0);
 
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
Добавлено через 18 секунд
alecss131, О спасибки, понял <3
0
155 / 9 / 1
Регистрация: 14.08.2019
Сообщений: 768
23.06.2022, 15:30  [ТС] 7
alecss131, Как правильно прописать для этих массивов?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
float vertices[] =
{
    1.0f, 1.0f, 0.0f,
    1.0f, 0.0f, 0.0f,
    0.0f, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f
};
 
float coords[] =
{
    1.0f, 1.0f,
    1.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 1.0f
};
 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), nullptr);
glEnableVertexAttribArray(0);
 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)(2 * sizeof(float)));
glEnableVertexAttribArray(2);
С одним массивом все было норм, а под два переделать не получается :C

Добавлено через 16 минут
Вроде как решил проблему

C++
1
2
3
4
5
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), nullptr);
glEnableVertexAttribArray(0);
 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)(sizeof(vertices)));
glEnableVertexAttribArray(2);
0
23.06.2022, 15:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2022, 15:30
Помогаю со студенческими работами здесь

Инициализация обнулённых массивов
Есть ли в С# аналогии инициализации массивов обнулёнными, как в С++, или в С# в принципе все...

Инициализация массивов указателей
Как сделать так, что бы элементы(указатели) массива указателей можно было инициализировать вводом с...

Инициализация массивов в конструкторе
Здравствуйте! Я делаю последнюю лабораторную и у меня ничего не получается. Возникает ошибка, что...

Инициализация двухмерных массивов
Доброго времени суток. Объясните, пожалуйста, почему так все работает нормально: int x =...

Инициализация одномерных массивов
1. Написать функцию для ввода текущего размера массива. При вводе предусмотреть защиту от...

Инициализация беззнаковых массивов
Здравствуйте, появилась необходимость в массиве символов неопределенного размера. На лекции в...

Обработка массивов с использованием указателей. Передача одномерных массивов в функции. Шаблоны функций
ПОМОГИТЕ!!!!!!! КАК ЭТО РЕШАТЬ??? Ввести и обработать два одномерных массива, содержащие...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru