如何通过着色器在世界中应用绘图位置?
我的顶点着色器看起来像这样:
in vec2 position;
uniform mat4x4 model;
uniform mat4x4 view;
uniform mat4x4 projection;
void main() {
gl_Position = projection * view * model * vec4(position, 0.0, 1.0);
}
其中position
是三角形顶点的位置。
我按照以下方式绑定矩阵。
视图:
glm::mat4x4 view = glm::lookAt(
glm::vec3(0.0f, 1.2f, 1.2f), // camera position
glm::vec3(0.0f, 0.0f, 0.0f), // camera target
glm::vec3(0.0f, 0.0f, 1.0f)); // camera up axis
GLint view_uniform = glGetUniformLocation(shader, "view");
glUniformMatrix4fv(view_uniform, 1, GL_FALSE, glm::value_ptr(view));
投影:
glm::mat4x4 projection = glm::perspective(80.0f, 640.0f/480.0f, 0.1f, 100.0f);
GLint projection_uniform = glGetUniformLocation(shader, "projection");
glUniformMatrix4fv(projection_uniform, 1, GL_FALSE, glm::value_ptr(projection));
模型转换:
glm::mat4x4 model;
model = glm::translate(model, glm::vec3(1.0f, 0.0f, 0.0f));
model = glm::rotate(model, static_cast<float>((glm::sin(currenttime)) * 360.0), glm::vec3(0.0, 0.0, 1.0));
GLint trans_uniform = glGetUniformLocation(shader, "model");
glUniformMatrix4fv(trans_uniform, 1, GL_FALSE, glm::value_ptr(model));
所以这种方式我必须计算CPU上每帧的位置变换。这是推荐的方式还是有更好的方式?
答案 0 :(得分:2)
所以这种方式我必须计算CPU上每帧的位置变换。这是推荐的方式还是有更好的方式?
是。为CPU上的网格计算一次新变换,然后将其应用于顶点着色器内网格内的所有顶点,这不会是一个非常慢的操作,需要每帧完成。
答案 1 :(得分:2)
在render()
方法中,您通常会执行以下操作
投影矩阵可以每windowResize
创建一次,或者在为相机创建矩阵时创建。
答案:您的代码很好,这是绘制/更新对象的基本方法。
您可以进入一些自动管理它的框架/系统。你不应该(现在)关注那些矩阵创建程序的性能......它非常快。绘图更成问题。
如 jozxyqk 在一条评论中写道,您可以创建ModelViewProjMatrix
并发送一个组合矩阵,而不是三个不同的矩阵。