4

如何通过着色器在世界中应用绘图位置?

我的顶点着色器如下所示:

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 上计算每一帧的位置变换。这是推荐的方式还是有更好的方式?

4

2 回答 2

2

所以这样我必须在 CPU 上计算每一帧的位置变换。这是推荐的方式还是有更好的方式?

是的。在 CPU 上为网格计算一次新变换,然后将其应用于顶点着色器内网格内的所有顶点,这不会是一个非常缓慢的操作,并且需要在每一帧中完成。

于 2013-08-28T13:21:39.533 回答
2

render()方法中你通常会做以下事情

  • 为相机创建矩阵(通常每帧一次)
  • 对于场景中的每个对象:
    • 创建变换(位置)矩阵
    • 绘制对象

投影矩阵可以每创建一次windowResize,也可以在为相机创建矩阵时创建。

答:您的代码很好,它是绘制/更新对象的基本方法。

您可以进入一些自动管理它的框架/系统。您(现在)不应该关心那些矩阵创建过程的性能......它非常快。绘图更成问题。

正如jozxyqk在一条评论中所写,您可以创建ModelViewProjMatrix和发送一个组合矩阵,而不是三个不同的矩阵。

于 2013-08-28T13:26:54.360 回答