我已成功加载模型,但现在我想要转换它。我只想说我知道变换如何工作以及我可以通过向量和矩阵进行的各种变换,并将它们简单地应用于模型矩阵,然后通过统一变量传递给顶点着色器。但这是我的问题:
我的模型是一个类,我还有一个场景类,其中加载了模型,并且所有图形内容都汇集在一起。如果我在Model中有一个模型矩阵作为私有变量,那么:
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,长话短说,简单地将模型的所有网格保持在一起,另一个类通过网格加载网格。
答案 0 :(得分:3)
模型/世界变换特定于场景中的每个网格/模型。就像你提到的那样,要独立地转换每个模型,每个模型都有一个矩阵。
对于顶点着色器,您可以使投影视图矩阵为均匀,模型矩阵为均匀,并将网格的顶点转换为剪辑空间。然后对于下一个模型,只需使用该网格矩阵更改模型矩阵,然后重复。