c++ - 为什么一旦我使用正交投影矩阵,OpenGL 就不会绘制任何东西?
问题描述
当我使用投影矩阵作为
glm::mat4 projection(1.0f);
一切正常,它画了一个矩形,但只要我使用
glm::mat4 projection = glm::ortho(0.0f, 800.0f, 600.0f, 0.0f, -1.0f, 1.0f);
我不再画任何东西了。
你知道为什么吗?
这是我的渲染器代码:
void Renderer::renderRect(Shader& shader, glm::vec2 pos, glm::vec2 size, glm::vec3 color, float rotation, float opacity) {
shader.use();
glm::mat4 model(1.0f);
glm::translate(model, glm::vec3(pos, 0.0f));
glm::scale(model, glm::vec3(size, 1.0f));
glm::mat4 view(1.0f);
glm::mat4 projection = glm::ortho(0.0f, 800.0f, 600.0f, 0.0f, -1.0f, 1.0f);
//glm::mat4 projection(1.0f);
shader.setMat4("model", model);
shader.setMat4("view", view);
shader.setMat4("projection", projection);
shader.setVec4("color", glm::vec4(color, opacity));
glBindVertexArray(quadVAO);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);
}
我不确定问题到底出在哪里,但也许它与我的顶点着色器有关:
#version 330 core
layout (location = 0) in vec2 pos;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
gl_Position = projection * view * model * vec4(pos.xy, 0.0, 1.0);
}
renderRect 函数由以下方式调用:
renderer->renderRect(shader, glm::vec2(200.0f, 200.0f), glm::vec2(300.0f, 300.0f), glm::vec3(0.0f, 0.0f, 1.0f));
顶点是:
float vertices[]{
0.0f, 1.0f,
1.0f, 0.0f,
0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 0.0f,
1.0f, 1.0f
};
解决方案
我发现了问题。它应该是:
model = glm::translate(model, glm::vec3(pos, 0.0f));
model = glm::scale(model, glm::vec3(size, 1.0f));
否则模型矩阵不会被平移和缩放。
推荐阅读
- c# - 是否有像 DEBUG 或 TRACE 一样为“优化代码”定义 C# 编译器?
- c - 从二维数组中删除数组(行) - C 编程
- c# - 代码的发布和调试版本的行为不一致
- javascript - 在页面标题(浏览器选项卡)中显示歌曲的元数据?
- jq - jq:错误(在
:131): 不能遍历字符串(“文件”) - c++ - 与现代 C++ 中的非侵入式容器相比,侵入式容器是否仍然具有性能优势?
- javascript - WebStorm 不记得类型提示
- c# - 在浏览器刷新或计算机重新启动后永久存储 Swagger UI 令牌
- python - 家庭作业项目。无法弄清楚如何通过 flask_sqlalchemy 求和值。烧瓶扔'AttributeError:'BaseQuery'对象没有属性'sum''
- flutter - 使用颤振无法在帖子请求中加载帖子