移动物体
物体在空间中的坐标变换简称mvp(model、view、projection),前面两章讲了vp,这章补上model变换。
目标是通过移动矩形坐标,复制出一个蓝色的棋盘图案,如下图所示:
拓展Renderer接口
在当前代码的基础上,稍作调整,就能实现棋盘效果。
拓展Renderer接口
Renderer->Submit接口增加移动的transform矩阵,在实现里将transform矩阵设置到shader中
Sandbox/Hazel/src/Hazel/Renderer/Renderer.h
c++
static void Submit(const std::shared_ptr<Shader>& shader, const std::shared_ptr<VertexArray>& vertexArray,
const glm::mat4& transform = glm::mat4(1.0f));
Sandbox/Hazel/src/Hazel/Renderer/Renderer.cpp
c++
void Renderer::Submit(const std::shared_ptr<Shader>& shader, const std::shared_ptr<VertexArray> &vertexArray, const glm::mat4& transform) {
shader->Bind();
shader->UploadUniformMat4("u_ViewProjection", s_SceneData->ViewProjectionMatrix);
shader->UploadUniformMat4("u_Transform", transform);
vertexArray->Bind();
RenderCommand::DrawIndexed(vertexArray);
}
绘制棋盘
修改ExampleLayer中的demo,将之前的矩形背景缩小到0.1,然后在for循环中生成10 * 10的方格矩阵。
Sandbox/src/SandBoxApp.cpp
c++
...
// -----------------矩形--------------------
// 注意矩形,顶点按照逆时针排列
float squareVertices[3*4] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
-0.5f, 0.5f, 0.0f
};
...
// 拓展vertexSrc,增加u_Transform字段,
// 乘到a_Position左边,这就是标准的mvp变换矩阵
std::string vertexSrc = R"(
#version 330 core
...
out vec3 v_Position;
out vec4 v_Color;
void main()
{
v_Position = a_Position;
v_Color = a_Color;
gl_Position = u_ViewProjection * u_Transform * vec4(a_Position, 1.0);
}
)";
...
std::string blueShaderVertexSrc = R"(
#version 330 core
layout(location = 0) in vec3 a_Position;
uniform mat4 u_ViewProjection;
uniform mat4 u_Transform;
out vec3 v_Position;
void main() {
v_Position = a_Position;
gl_Position = u_ViewProjection * u_Transform * vec4(a_Position, 1.0);
}
)";
绘制棋盘
c++
...
Hazel::Renderer::BeginScene(m_Camera);
static glm::mat4 scale = glm::scale(glm::mat4(1.0f), glm::vec3(0.1f));
for (int y = 0; y < 20; y++) {
for (int x = 0; x < 20; x++) {
glm::vec3 pos(x * 0.11f, y * 0.11f, 0.0f);
glm::mat4 transfrom = glm::translate(glm::mat4(1.0f), pos) * scale;
Hazel::Renderer::Submit(m_BlueShader, m_SquareVA, transfrom);
}
}
// Hazel::Renderer::Submit(m_BlueShader,m_SquareVA);
Hazel::Renderer::Submit(m_Shader, m_VertexArray);
Hazel::Renderer::EndScene();
...
完整代码 & 总结
完整代码:
github.com/summer-go/H...
得益于前面花了很多时间做基础的能力建设,对渲染API做了合理的封装,现在绘制一个棋盘,只需要一个for循环即可。
当前的代码离完整的引擎还有很远的距离,但是已经有引擎的雏形了。