首页 > 解决方案 > 了解现代 OpenGL 中的代码绘制 .obj 并设置不同的位置

问题描述

我正在观看现代 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) 位置绘制,我希望它在 Y 轴上平移 (-1.0f)。我知道如何翻译矩阵,但不知道如何使用 .obj 进行管理。

编辑:感谢您的回答

我的 vs 代码如下所示:

#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;
}

标签: c++openglwavefront

解决方案


如果您的问题是“我如何在空间中移动 obj”,则可以使用平移矩阵和着色器(模型视图投影)矩阵中的 MVP 矩阵来完成(在现代 opengl 中)。仅您的代码,只是在要绘制的 gpu 上设置顶点,但根本不绘制。

选择缓冲区后,您将需要 glDrawElements 操作。此外,您将需要设置着色器和矩阵,否则 obj 将始终在原点 (0.,0.) 上呈现。

如果您有 glDraw,则需要显示您正在使用的着色器。


推荐阅读