Я писал программу, которая отображает 3D-сетки с использованием OpenGl. Я попробовал загрузить сетку с примерно 70 000 вершинами, и это заняло довольно много времени. Я просто экспортировал свою модель из блендера в формате .obj и анализировал ее таким образом, но мне было интересно, есть ли лучший способ, поскольку то, что я делаю сейчас, происходит довольно медленно. На данный момент меня не интересует ничего, кроме позиций и индексов вершин.
Есть ли для этого лучший формат файла? Или можно оптимизировать код ниже? Каков отраслевой стандарт для подобных вещей? Должен ли я просто смириться с тем, что это будет медленно, несмотря ни на что?
Вот что я делаю, чтобы загрузить вершины и индексы. В настоящее время для довольно большой сетки с ~70 000 вершин это занимает ~1950 мс (с \O2).
struct MeshData {
std::vector vertexPositions;
std::vector indicies;
};
MeshData VertexTest::parseObj(const char* path)
{
Timer t("Loading");
MeshData data;
std::ifstream stream(path);
std::string line;
srand(time(NULL));
while (std::getline(stream, line)) {
//if line specifies vertex position eg. "v -1.0 1.0 1.0"
if (line[0] == 'v' && line[1] == ' ') {
line = line.substr(2);
std::stringstream ss(line);
float num;
while (ss >> num) {
data.vertexPositions.push_back(num);
}
data.vertexPositions.push_back((float)rand() / (float)RAND_MAX);
data.vertexPositions.push_back((float)rand() / (float)RAND_MAX);
data.vertexPositions.push_back((float)rand() / (float)RAND_MAX);
data.vertexPositions.push_back(1.0f);
}
//if line specifies face eg. "f 1/2/3 3/2/4 2/3/2"
if (line[0] == 'f' && line[1] == ' ') {
line = line.substr(2);
std::stringstream parse(line);
std::string section;
std::vector temp;
//only extract first int from each "x/y/z" others don't matter
while (std::getline(parse, section, ' ')) {
temp.push_back(std::stoi(section.substr(0, section.find('/'))) - 1);
}
if (temp.size() == 4) {
data.indicies.push_back(temp[0]);
data.indicies.push_back(temp[1]);
data.indicies.push_back(temp[2]);
data.indicies.push_back(temp[0]);
data.indicies.push_back(temp[2]);
data.indicies.push_back(temp[3]);
}
else if (temp.size() == 3) {
data.indicies.push_back(temp[0]);
data.indicies.push_back(temp[1]);
data.indicies.push_back(temp[2]);
}
else {
std::cout
Подробнее здесь: https://stackoverflow.com/questions/785 ... uffer-from
Каков самый быстрый способ чтения позиций и индексов вершин в буфер из файла .obj? [закрыто] ⇐ C++
Программы на C++. Форум разработчиков
1716654596
Anonymous
Я писал программу, которая отображает 3D-сетки с использованием OpenGl. Я попробовал загрузить сетку с примерно 70 000 вершинами, и это заняло довольно много времени. Я просто экспортировал свою модель из блендера в формате .obj и анализировал ее таким образом, но мне было интересно, есть ли лучший способ, поскольку то, что я делаю сейчас, происходит довольно медленно. На данный момент меня не интересует ничего, кроме позиций и индексов вершин.
Есть ли для этого лучший формат файла? Или можно оптимизировать код ниже? Каков отраслевой стандарт для подобных вещей? Должен ли я просто смириться с тем, что это будет медленно, несмотря ни на что?
Вот что я делаю, чтобы загрузить вершины и индексы. В настоящее время для довольно большой сетки с ~70 000 вершин это занимает ~1950 мс (с \O2).
struct MeshData {
std::vector vertexPositions;
std::vector indicies;
};
MeshData VertexTest::parseObj(const char* path)
{
Timer t("Loading");
MeshData data;
std::ifstream stream(path);
std::string line;
srand(time(NULL));
while (std::getline(stream, line)) {
//if line specifies vertex position eg. "v -1.0 1.0 1.0"
if (line[0] == 'v' && line[1] == ' ') {
line = line.substr(2);
std::stringstream ss(line);
float num;
while (ss >> num) {
data.vertexPositions.push_back(num);
}
data.vertexPositions.push_back((float)rand() / (float)RAND_MAX);
data.vertexPositions.push_back((float)rand() / (float)RAND_MAX);
data.vertexPositions.push_back((float)rand() / (float)RAND_MAX);
data.vertexPositions.push_back(1.0f);
}
//if line specifies face eg. "f 1/2/3 3/2/4 2/3/2"
if (line[0] == 'f' && line[1] == ' ') {
line = line.substr(2);
std::stringstream parse(line);
std::string section;
std::vector temp;
//only extract first int from each "x/y/z" others don't matter
while (std::getline(parse, section, ' ')) {
temp.push_back(std::stoi(section.substr(0, section.find('/'))) - 1);
}
if (temp.size() == 4) {
data.indicies.push_back(temp[0]);
data.indicies.push_back(temp[1]);
data.indicies.push_back(temp[2]);
data.indicies.push_back(temp[0]);
data.indicies.push_back(temp[2]);
data.indicies.push_back(temp[3]);
}
else if (temp.size() == 3) {
data.indicies.push_back(temp[0]);
data.indicies.push_back(temp[1]);
data.indicies.push_back(temp[2]);
}
else {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78526552/what-is-the-fastest-way-to-read-vertex-positions-and-indices-into-a-buffer-from[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия