【发布时间】:2021-12-14 05:21:43
【问题描述】:
我有 2 个函数,第一个函数在世界上渲染我的对象,而第二个函数应该像 UI 一样直接在相机的视图框架中渲染我的对象。如果相机移动,则物体在随相机移动时看起来是静止的。但是,我的第二个函数似乎不起作用,因为什么都没有出现,我的视图投影矩阵的逻辑是否不正确?
这是将相机的视图投影矩阵发送到顶点着色器以渲染世界中的对象的函数,它起作用了:
void Renderer2D::BeginScene(const OrthographicCamera& camera)
{
s_Data.shader = LightTextureShader;
(s_Data.shader)->Bind();
(s_Data.shader)->SetMat4("u_ViewProjection", camera.GetViewProjectionMatrix());
s_Data.CameraUniformBuffer->SetData(&s_Data.CameraBuffer, sizeof(Renderer2DData::CameraData));
s_Data.QuadVertexBuffer = LightQuadVertexBuffer;
s_Data.QuadVertexArray = LightQuadVertexArray;
s_Data.QuadIndexCount = LightQuadIndexCount;
s_Data.QuadVertexBufferBase = LightQuadVertexBufferBase;
StartBatch();
}
这是应该像 UI 一样将我的对象直接渲染到相机的函数,但它不起作用:
void Renderer2D::BeginUIScene(const OrthographicCamera& camera)
{
s_Data.shader = TextureShader;
(s_Data.shader)->Bind();
Mat4 projection = getOrtho(0.0f, camera.GetWidth(), 0.0f, camera.GetHeight(), -1.0f, 1.f);
(s_Data.shader)->SetMat4("u_ViewProjection", projection);
s_Data.CameraUniformBuffer->SetData(&s_Data.CameraBuffer, sizeof(Renderer2DData::CameraData));
s_Data.QuadVertexBuffer = TexQuadVertexBuffer;
s_Data.QuadVertexArray = TexQuadVertexArray;
s_Data.QuadIndexCount = TexQuadIndexCount;
s_Data.QuadVertexBufferBase = TexQuadVertexBufferBase;
StartBatch();
}
编辑: getOrtho() 的声明:
Mat4 getOrtho(float left, float right, float bottom, float top, float zNear, float zFar);
【问题讨论】:
-
在屏幕上绘制 UI 元素时不需要每帧更新视图矩阵
-
这是真的!但是矩阵仍然不正确
-
它是 Hazel 引擎! :)
标签: c++ opengl camera vertex-shader coordinate-transformation