【发布时间】:2014-12-30 04:06:30
【问题描述】:
我已经成功加载了一个模型,但现在我想对其进行转换。我只想说我知道转换是如何工作的,以及我可以通过向量和矩阵进行的各种转换,并将它们简单地应用于模型矩阵,然后通过统一变量传递给顶点着色器。但这是我的问题:
我的模型是一个类,我还有一个场景类,其中加载了模型,并且是所有图形内容的集合。如果我有一个模型矩阵作为模型中的私有变量,那么:
class Model
{
public:
Model();
~Model();
// other functions here
setPosition(vec3 pos);
setRotation(vec3 axis, float angle);
setScale(vec3 factor);
// getters
render(GLuint shaderProgram);
update(GLuint shaderProgram);
private:
mat4 pModelMatrix;
vector<Mesh> pMeshes;
};
将模型矩阵放在模型类中是否明智?或者应该只有一个模型矩阵在场景类中,然后通过统一传递到顶点着色器中。我对后者的唯一担心是,如果我这样做,那么所有模型都将具有相同的转换。所以,如果我只想移动一个模型(玩家会拥有[是的,它是有还是有争论!]),那么只将转换应用于该模型并因此应用于它所关注的模型矩阵。但是,那么顶点着色器会说什么呢?我对 OpenGL 还是很陌生,要了解 OpenGL 如何处理具有多个渲染模型的转换的整个业务有点复杂;我知道它们服务于前面描述的目的,但是是否可以将许多模型的许多模型矩阵传递给一个单一的统一矩阵是很难实现的。
update() 函数的作用是获取 pModelMatrix 并使用 glUniform() 东西将矩阵传递给顶点着色器,然后与所有其他矩阵相乘,依此类推。我将 glUniform() 东西放入 update() 函数的原因是,当我的程序运行时,我希望通过 setPosition(..) 记录我的模型的位置,然后只要程序正在运行,最终根据需要更新模型.
矢量 pMeshes,长话短说,只是将模型的所有网格保存在一起,另一个类逐个加载网格。
【问题讨论】: