Проблема с загрузчиком модели OpenGL

Наконец, мой рабочий погрузчик работал (исходя из предыдущего вопроса). Сохраняет все значения в порядке, отлично работает glDrawElemts, но не запускает glDrawArrays.

Да, первое, что вы скажете: «glDrawArrays явно не написано правильно». В этом проблема - я на 99% уверен, что это так.

Код выглядит следующим образом:

bool modelLoader(string fileName,vector& vertices, vector& indices)
{
fstream objFile;
vector localVertices;
string dataLine;
stringstream mystream;
GLfloat x, y, z;
GLushort ind1, ind2, ind3;
char c, d; 
vertices.clear();
indices.clear();

for (int i = 0; i < 3; i++)
{
    vertices.push_back(0);
}


for (int i = 0; i < 3; i++)
{
    localVertices.push_back(0);
}


objFile.open(fileName);
if (!objFile.good())
{
    printf("Error with loader");
    return false; 
}

while (!objFile.eof())
{
    getline(objFile, dataLine);
    if (dataLine == "") 
    {                                                                  
        mystream.clear();                                              
        continue;                                                      
    }                                                                  
    mystream.clear();                                                  
    mystream.str(dataLine);                                            
    c = dataLine[0];                                                   
    d = dataLine[1];
    mystream.ignore(2);
    switch (c)
    {
    case 'v':
        {
            switch (d)
            {
            case 'n':
                { /* for normals */ break;}
            case ' ':
                mystream >> x >> y >> z;
                localVertices.push_back(x);
                localVertices.push_back(y);
                localVertices.push_back(z);
                printf("\nVertices: %f, %f, %f", x, y, z);
                break;
            default:
                {break;}
            }                                                                                                    
            break;                                                                                               
        }                                                                                                        
    case 'f':                                                                                                    
        {                                                                                                        
            //printf("F entered");                                                                               
            mystream >> ind1 >> ind2 >> ind3;                                                                    
            vertices.push_back(localVertices[ind1* 3 + 0]);                                                      
            vertices.push_back(localVertices[ind1* 3 + 1]);                                                      
            vertices.push_back(localVertices[ind1* 3 + 2]);                                                      
            vertices.push_back(localVertices[ind2* 3 + 0]);                                                      
            vertices.push_back(localVertices[ind2* 3 + 1]);                                                      
            vertices.push_back(localVertices[ind2* 3 + 2]);                                                      
            vertices.push_back(localVertices[ind3* 3 + 0]);                                                      
            vertices.push_back(localVertices[ind3* 3 + 1]);                                                     
            vertices.push_back(localVertices[ind3* 3 + 2]);
            indices.push_back(ind1);
            indices.push_back(ind2);
            indices.push_back(ind3);
            printf("\nIndices: %d, %d, %d", ind1, ind2, ind3);
            break;
        }
    case !'v' || !'f':
        {
            break;
        }
    default:
        {break;}
    }
    mystream.clear();
}
objFile.close(); 
return true;
 }

Отсюда я перейду к следующей функции:

vector vertices;

vector indices;


if (!modelLoader("triangles.obj", vertices, indices))
{
    cout << "FAILED TO RUN: MODEL LOADER";

    return 1;
}

Вставьте кучу других malarky о настройке матрицы представления модели, запустив цикл для обновления каждой итерации ...

int size = vertices.size()-3;

glDrawArrays(GL_TRIANGLES, 3, (GLsizei)size);

О, и файл triangles.obj:

v -10.0 10.0 10.0
v -10.0 -10.0 10.0
v 10.0 -10.0 10.0
v 10.0 10.0 10.0
v 20.0 10.0 10.0
v 20.0 -10.0 10.0
f 1 2 3
f 4 5 6

Без радости. Как я уже сказал, использование DrawElements делает это прекрасно, но вызывает ошибку исключения, когда я пытаюсь нарисовать любой другой .obj-файл.

Какие-нибудь подсказки относительно того, где я иду не так?

1
nl ja de
Что такое , это «ошибка исключения»? Потому что, честно говоря, это самая важная часть.
добавлено автор Bartek Banachewicz, источник
while (! objFile.eof() ) неверно . Какой учебный ресурс вам сказал?
добавлено автор Lightness Races in Orbit, источник
@DerryHolt: Нажмите на ссылку и узнайте. Затем отправьте своего репетитора в мой профиль переполнения стека и попросите его связаться - он учит вещи wrong .
добавлено автор Lightness Races in Orbit, источник
@DerryHolt: Я не говорю, что это решение вашей проблемы. Обычно это проявляется более тонко.
добавлено автор Lightness Races in Orbit, источник
Я все еще изучаю OpenGL самостоятельно, но разве вы не должны использовать или glDrawElements или glDrawArrays, а не оба?
добавлено автор Zutty, источник
Я использую только один, не волнуйтесь! Я просто пытаюсь заставить Оба работать (индивидуально).
добавлено автор DerryHolt, источник
@LightnessRacesinOrbit мой наставник .. Ха! Какую альтернативу вы предлагаете?
добавлено автор DerryHolt, источник
Woops. Пропустил это. Благодаря!
добавлено автор DerryHolt, источник
@LightnessRacesinOrbit Это довольно странно, я просто быстро просмотрел его модельный загрузчик, и он использует while (! Infile.eof ()), и он отлично работает. Он даже не проверяет чек в своей петле. Чрезвычайно странно, что два человека, использующих очень похожий загрузчик моделей, имеют противоположные результаты!
добавлено автор DerryHolt, источник
Векторный индекс вне диапазона в строке 1440. Я начал переписывать загрузчика сейчас, и я немного его сломал, поэтому я дам вам знать, когда я его завтра исправлю, точно, какая ошибка!
добавлено автор DerryHolt, источник

1 ответы

Вы намерены не нарисовать первый треугольник? Правильный вызов для рисования всех треугольников должен быть glDrawArrays (GL_TRIANGLES, 0, (GLsizei) vertices.size ()); До этого вам также нужно активировать вызовы и установить массивы вверх по glEnableClientState (GL_VERTEX_ARRAY) и glVertexPointer() . То же самое для других атрибутов, таких как цвет и нормали, если вы хотите их. BTW, все это устарело с момента OpenGL 3.0, поэтому вам может понадобиться изучить API 3.0 ядра, если вы только начинаете.

0
добавлено
Просто интересно, но почему DirectX более привлекателен для вас? Я не знаю никаких существенных функциональных различий.
добавлено автор Joe, источник
Честно говоря, я не намерен продолжать openGL задолго до конца этого модуля для своей степени. Мы начинаем DirectX в следующем году, что гораздо более привлекательно! Да, я использую разрешающие состояния и указатели.
добавлено автор DerryHolt, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

pro.graphon (and gamedev)
pro.graphon (and gamedev)
389 участник(ов)

Обсуждаем стандарты консорциума Khronos: OpenGL, OpenCL и пр., предлагаем различные работы, туторы, интересные материалы по этим стандартам (и помечаем их тегами). Правила чата и инфо по системе тегов – /rules. Реклама только по согласованию с @AlexFails.

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest