Понимание рисования кода .obj в современном OpenGL и установка различных позиций - PullRequest
1 голос
/ 15 мая 2019

Я смотрю современное учебное пособие по OpenGL и не до конца понимаю код, который рисует файл .obj.Я имею в виду, что это работает довольно хорошо, но у меня есть небольшая проблема с изменением положения отображаемого объекта.

Вершинные массивы генерируются glGenVertexArrays (), и я думаю, что есть строка, которую я должен изменить, но незнаю, как.

Я использую код:

Mesh::Mesh(const std::string& fileName)
{
    InitMesh(OBJModel(fileName).ToIndexedModel());
}

void Mesh::InitMesh(const IndexedModel& model)
{
    m_numIndices = model.indices.size();

    glGenVertexArrays(1, &m_vertexArrayObject);
    glBindVertexArray(m_vertexArrayObject);

    glGenBuffers(NUM_BUFFERS, m_vertexArrayBuffers);

    glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[POSITION_VB]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(model.positions[0]) * model.positions.size(), &model.positions[0], GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[TEXCOORD_VB]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(model.texCoords[0]) * model.texCoords.size(), &model.texCoords[0], GL_STATIC_DRAW);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[NORMAL_VB]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(model.normals[0]) * model.normals.size(), &model.normals[0], GL_STATIC_DRAW);
    glEnableVertexAttribArray(2);
    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vertexArrayBuffers[INDEX_VB]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(model.indices[0]) * model.indices.size(), &model.indices[0], GL_STATIC_DRAW);

    glBindVertexArray(0);
}

Мой объект рисует из (0,0,0) позиции, и я хочу, чтобы он был переведен (-1,0f) наОсь YЯ знаю, как переводить матрицы, но не знаю, как справиться с .obj.

РЕДАКТИРОВАТЬ: Спасибо за ваши ответы

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

#version 330

uniform mat4 P;
uniform mat4 V;
uniform mat4 M;


layout (location=0) in vec4 vertex;
layout (location=2) in vec2 texCoord; 

out vec2 i_tc;

void main(void) {
    gl_Position=P*V*M*vertex;
    i_tc=texCoord;
}

1 Ответ

0 голосов
/ 15 мая 2019

Если ваша проблема заключается в том, «как я могу переместить объект в пространстве», это делается (в современном opengl) с использованием матрицы перевода и матрицы MVP в матрице шейдеров (проекция модели).Ваш код один только устанавливает вершины в графическом процессоре, которые нужно нарисовать, но не рисует вообще.

Вам потребуется операция glDrawElements после выбора буфера.Кроме того, вам нужно будет настроить шейдер и матрицы, или объект всегда будет отображаться в исходной точке (0., 0.).

Если у вас есть glDraw, вам нужно показать шейдерты используешь.

...