C++ 理解现代OpenGL中的代码绘制.obj并设置不同的位置
我正在看现代OpenGL教程,但我不完全理解绘制.obj文件的代码。我的意思是,它工作得很好,但我有一个小问题,改变显示对象的位置 顶点数组是由glgenvertexarray()生成的,我认为有一条线我应该更改,但不知道如何更改 我使用以下代码:C++ 理解现代OpenGL中的代码绘制.obj并设置不同的位置,c++,opengl,wavefront,C++,Opengl,Wavefront,我正在看现代OpenGL教程,但我不完全理解绘制.obj文件的代码。我的意思是,它工作得很好,但我有一个小问题,改变显示对象的位置 顶点数组是由glgenvertexarray()生成的,我认为有一条线我应该更改,但不知道如何更改 我使用以下代码: Mesh::Mesh(const std::string& fileName) { InitMesh(OBJModel(fileName).ToIndexedModel()); } void Mesh::InitMesh(const
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”(在现代opengl中),则可以使用着色器(模型视图投影)矩阵中的平移矩阵和MVP矩阵来完成。
您的代码本身,只是在gpu上设置要绘制的顶点,但根本不绘制
在选择缓冲区后,您将需要一个GLDraweElements操作。
此外,还需要设置着色器和矩阵,否则obj将始终在原点(0,0.)上渲染
如果有glDraw,则需要显示正在使用的着色器 如果您的问题是“如何在空间中移动obj”(在现代opengl中),则可以使用着色器(模型视图投影)矩阵中的平移矩阵和MVP矩阵来完成。
您的代码本身,只是在gpu上设置要绘制的顶点,但根本不绘制
在选择缓冲区后,您将需要一个GLDraweElements操作。
此外,还需要设置着色器和矩阵,否则obj将始终在原点(0,0.)上渲染
如果有glDraw,则需要显示正在使用的着色器 更改透视是在实际渲染调用中执行的操作,而不是在网格中。顶点着色器代码应包含从顶点属性中的
获取输入并将其指定给gl\u位置
的代码。在那里应用您的转换,最好通过体现翻译的mat4
统一的方式。如果所有这些对你来说都是中文的,请发布你的着色器代码(和绘图代码),这样我们可以给出具体的建议。这种设置非常标准:你有三个统一的矩阵,一个用于投影、视图和模型。有关这些矩阵的作用以及它们如何协同工作的讨论,请参见,但简短的要点是,您应该将M
矩阵的旋转部分设置为单位矩阵,并将其平移部分设置为(0,-1,0)
现在可以工作了,你们太棒了,非常感谢!波前已经被解析,你的函数只是将这些数据绑定到着色器GPU程序。检查传输M、V和P矩阵的代码是否一致。您需要转换视图矩阵。另外,最好将预乘MVP矩阵传输到共享以提高渲染性能。更改透视图是在实际渲染调用中执行的操作,而不是在网格中。顶点着色器代码应包含从
顶点属性中的获取输入并将其指定给gl\u位置
的代码。在那里应用您的转换,最好通过体现翻译的mat4
统一的方式。如果所有这些对你来说都是中文的,请发布你的着色器代码(和绘图代码),这样我们可以给出具体的建议。这种设置非常标准:你有三个统一的矩阵,一个用于投影、视图和模型。有关这些矩阵的作用以及它们如何协同工作的讨论,请参见,但简短的要点是,您应该将M
矩阵的旋转部分设置为单位矩阵,并将其平移部分设置为(0,-1,0)
现在可以工作了,你们太棒了,非常感谢!波前已经被解析,你的函数只是将这些数据绑定到着色器GPU程序。检查传输M、V和P矩阵的代码是否一致。您需要转换视图矩阵。另外,最好将预乘MVP矩阵传输到共享,以提高渲染性能。