2015-08-10 2 views
0

В настоящее время я разбираю файл .mtl, связанный с файлом .obj, который у меня есть. Я могу правильно отобразить модель, но как я могу использовать файл .mtl? Где я должен отправить эти ценности? Как его использовать? В настоящее время не удается найти что-либо, использующее файл .mtl в OpenGL. Они просто показывают, как они анализируют его.Основное использование .MTL в OpenGL

EDIT: Как это сделать в OpenGL. Я также создал свой собственный анализатор OBJ. Обратите внимание, что код сокращается только для вас, как я это делаю.

GLuint vao; 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 

GLuint buffer; 
glGenBuffers(1, &buffer); 
glBindBuffer(GL_ARRAY_BUFFER, buffer); 
glBufferData(GL_ARRAY_BUFFER, cc * sizeof(GLfloat), v, GL_STATIC_DRAW); 

GLuint tcbuffer; 
glGenBuffers(1, &tcbuffer); 
glBindBuffer(GL_ARRAY_BUFFER, tcbuffer); 
glBufferData(GL_ARRAY_BUFFER, tcc * sizeof(GLfloat), vt, GL_STATIC_DRAW); 

GLuint ncbuffer; 
glGenBuffers(1, &ncbuffer); 
glBindBuffer(GL_ARRAY_BUFFER, ncbuffer); 
glBufferData(GL_ARRAY_BUFFER, ncc * sizeof(GLfloat), vn, GL_STATIC_DRAW); 

glEnableVertexAttribArray(m_vert); 
glBindBuffer(GL_ARRAY_BUFFER, vbufferid); 
glVertexAttribPointer(m_vert, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(m_texcoord); 
glBindBuffer(GL_ARRAY_BUFFER, tcbufferid); 
glVertexAttribPointer(m_texcoord, 2, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(m_color); 
glBindBuffer(GL_ARRAY_BUFFER, cbufferid); 
glVertexAttribPointer(m_color, 4, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(m_vertexnormal); 
glBindBuffer(GL_ARRAY_BUFFER, ncbufferid); 
glVertexAttribPointer(m_vertexnormal, 3, GL_FLOAT, GL_FALSE, 0, 0); 

glDrawArrays(GL_TRIANGLES, 0, vc); 

ответ

3

Файл MTL, сопровождающий файл .OBJ, представляет собой описание материалов, применяемых к сетке .OBJ. Для каждого материала он определяет путь текстуры и несколько цветовых свойств, таких как диффузный и зеркальный цвет.

OpenGL не заботится о .obj, поэтому он также не заботится о .MTL, то, как вы используете данные, зависит от вас. Существует несколько способов применить данные в файле .MTL к opengl-сетке. Самый простой способ сделать это:

Посмотрите на инструкции USEMTL файла OBJ и разделите лица на основе материала, в основном, всякий раз, когда вы видите USEMTL X, все следующие лица должны быть нарисованы материалом X, пока вы не столкнулись с новым USEMTL Y.

Затем, когда вы рисуете для каждого материала, называемого MAT: свяжите текстуру с .MTL-файлом для MAT, задайте диффузные и зеркальные параметры для MAT и рисуйте только те грани, где .OBJ сказал USEMTL MAT.

Есть несколько других способов быть более эффективными в этом вопросе, сообщите мне, как вы в настоящее время рисуете свою сетку, так как это влияет на лучший вариант.

Файл MTL может содержать более продвинутый материал, но это должно помочь вам начать работу.

Для получения дополнительной информации о файле MTL и значениях значений см. Wavefront .obj file.

+0

Я отредактировал сообщение и просмотрю код, который я добавил. Я просто хочу спросить также, используются ли значения в .MTL специально для шейдеров, таких как Kd? – zyneragetro

+0

Хорошо, что нет «конкретной» вещи об этом :). Значения Kd сообщают вам значения диффузного освещения для материала. Вы можете игнорировать их, если хотите, и вместо этого использовать немодифицированный цвет текстуры, но не будет выглядеть так, как MTL-файл скажет вам, что он должен выглядеть. Поэтому, если вы хотите использовать диффузное значение в шейдере, я думаю, что текстура2D (текстура, texcoord) * Kd сделает трюк. –

+0

Кроме того, из вашего примера кода, к чему вы должны стремиться, если вы хотите использовать несколько материалов, является вызовом glDrawArrays для каждого материала, и вам также понадобится отдельный буфер для каждого вызова (или смещения в одном буфере) , Затем между ними вы вызываете glBindTexture для привязки каждого материала и устанавливаете Kd и другие как однородные цвета, тогда вы делаете магию в шейдере. Это не очень сложно, но для этого требуется умеренное понимание opengl. –

Смежные вопросы