gpt4 book ai didi

c++ - 了解现代 OpenGL 中的代码绘制 .obj 并设置不同的位置

转载 作者:太空宇宙 更新时间:2023-11-04 12:36:38 26 4
gpt4 key购买 nike

我正在观看现代 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;
}

最佳答案

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

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

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

关于c++ - 了解现代 OpenGL 中的代码绘制 .obj 并设置不同的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56147401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com