c++ - 了解现代 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;
}
解决方案
如果您的问题是“我如何在空间中移动 obj”,则可以使用平移矩阵和着色器(模型视图投影)矩阵中的 MVP 矩阵来完成(在现代 opengl 中)。仅您的代码,只是在要绘制的 gpu 上设置顶点,但根本不绘制。
选择缓冲区后,您将需要 glDrawElements 操作。此外,您将需要设置着色器和矩阵,否则 obj 将始终在原点 (0.,0.) 上呈现。
如果您有 glDraw,则需要显示您正在使用的着色器。
推荐阅读
- reactjs - 为什么使用 React Hooks useState() 的计数在两个数字之间交替?
- haskell - Haskell 中的构造函数有类似 DuplicateRecordFields 的东西吗?
- java - 多次更新仅适用于 jdbc 中的查询之一
- python - 使用文本文件中的数字进行 Python 冒泡排序
- javascript - 如何根据日期显示数组,它有一个基于javascript日期的限制
- linux - 这段代码给了我正确的答案,但我不明白为什么它显示在第 7 行和第 8 行中找不到?
- python - AttributeError:“FigureManagerBase”对象没有属性“window”
- excel - 从单元格中收集数据并分配给一个范围。如何避免自动文本编号?
- vb.net - 文本框和货币格式
- excel - Excel VBA。将单元格列表转换为范围