我使用GLM为Vulkan渲染器创建了一个投影矩阵,但在顶点着色器中将其与顶点本身相乘后,没有任何渲染。我已经定义了GLM_FORCE_RADIANS和GLM_FORCE_DEPTH_ZERO_TO_ONE(好的是,我尝试不使用这两个,或者不使用其中一个(。我还试着把fovy参数作为度或弧度来传递,但无济于事。此外,我注意到正交矩阵工作得很好!这是我的顶点着色器代码,矩阵创建本身和正面是CCW(如果可以帮助的话(,深度测试被禁用(还没有实现(:
投影矩阵创建:
glm::mat4 projection = glm::perspective(45.0f, 16.0f / 9.0f, 0.1f, 100.0f);
glm::mat4 model = glm::mat4(1.0f);
model = glm::rotate(model, (float)glfwGetTime() * 30, glm::vec3(0.0f, 0.0f, 1.0f));
顶点着色器:
#version 460 core
layout(location = 0) in vec2 aPos;
layout(location = 1) in vec3 aColor;
layout(push_constant) uniform MVP {
mat4 VP;
mat4 Transform;
} matrices;
layout(location = 0) out vec4 Color;
void main()
{
gl_Position = matrices.VP * matrices.Transform * vec4(aPos,
1.0f, 1.0f);
Color = vec4(aColor, 1.0f);
}
我包括GLM:的方式
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
来自glm::perspective
:
fovy如果定义了GLM_FORCE_radians,则以弧度表示,否则以度表示。
您定义的是GLM_FORCE_RADIANS
,这意味着您应该将弧度作为值传递给glm::perspective
。您的示例中的值(45.0f
(看起来像度,但我可能错了。
我修复了它;"问题";投影和透视分割将[-near,-far]范围映射到[-1,1],从而导致Z坐标翻转。同时,我的Z坐标是10.0f,它实际上在相机后面。解决方案是将Z坐标值设置为-10.0f,投影后将翻转到10.0f。