c++ - OpenGL 无缘无故地剪辑一个对象
问题描述
我正在尝试可视化一个由沿 x 和 y 轴的 -1 到 1 个顶点组成的简单四边形。为什么opengl剪辑对象?代码对我来说似乎是正确的
glm::mat4 m = glm::translate(glm::mat4{1.0f}, toGlmVec3(objectPosition));
glm::mat4 v = glm::lookAtLH(toGlmVec3(cameraPosition), toGlmVec3(objectPosition), glm::vec3(0, 1, 0));
glm::mat4 p = glm::perspective(glm::radians(50.f), float(640.f) / 480.f, 0.0001f, 100.f);
glm::mat4 mvp = /* p* */ v * m; // when I take p back, the object disappears completely
testShader.use();
testShader.setVector4("u_color", math::Vector4f(0.f, 1.f, 0.f, 1.f));
testShader.setMatrix4("u_mMVP", mvp);
在着色器的代码中只有一行
gl_Position = u_mMVP * vec4(a_Pos, 1.0);
如果我注释掉v *
,那么它工作正常并且对象在屏幕上沿 x 和 y 轴移动
所以看起来渲染代码工作正常但是视图和投影矩阵有什么问题?
解决方案
对象被正交投影的近平面和远平面剪裁。如果您没有明确设置投影矩阵,则投影矩阵是Identity matrix。近平面远窗格为 +/- 1。
用于glm::ortho
定义不同的投影矩阵。例如:
glm::mat4 p = glm::ortho(-1, 1, -1, 1, -10, 10);
正交投影矩阵定义了围绕观察者位置的长方体观察体。此体积之外的所有几何图形都将被剪裁。
推荐阅读
- c# - 找到使用计数签到的方法
- python - 执行 python 脚本并在 WXPython GUI 中显示进度
- nullpointerexception - 使用 SelectInput() 时出现 NullPointer 异常
- ruby-on-rails - ArgumentError - 测试控制器的显示方法时参数数量错误(2 比 1)
- javascript - ngx完美滚动条更新功能未定义?
- c# - 同步上下文中的上下文是什么意思
- mysql - 流错误,尝试在 Compress::Raw::Zlib::_deflateInit 中初始化 deflate 对象
- java - 在 Java java.sql.Timestamp 中按原样检索 Oracle 日期/时间戳字段,而不转换为 DST
- java - 需要对 CompletableFuture 的 supplyAsync 和 whenComplete 方法进行详细解释
- azure - Nlog Azure 存储 blob 名称不接受布局变量