从规范上来看:
VK_KHR_maintenance1
允许在 slink::VkViewport::height 字段中指定负高度,以执行从裁剪空间到帧缓冲空间变换的y轴反转。这使得应用程序可以避免在还针对其他API的着色器中使用 gl_Position.y = -gl_Position.y。
我的物理设备支持版本 1.0.42
,并且我已经启用了 VK_KHR_maintenance1
。
当我在 VkViewport
结构中使用负高度时,我不会收到任何验证错误/警告。
vkCmdSetViewport(vkContext.commandBuffer, 0, 1, &viewport);
然而,我在屏幕上也没有看到任何东西,它是黑色的。如果我去掉viewport
中的负值,一切都会如预期渲染。我需要做些什么来使用VK_KHR_maintenance1扩展
翻转viewport吗?我只是在屏幕上渲染一个红色四边形,使用全屏viewport。
VkViewport viewport = {};
viewport.x = 0.0f;
viewport.y = 0.0f;
viewport.width = 1024.0f;
viewport.height = -1024.0f;
viewport.minDepth = 0.0f;
viewport.maxDepth = 1.0f;
vkCmdSetViewport(vkContext.commandBuffer, 0, 1, &viewport);
顶点着色器:
void main() {
vec4 positions[3] = {
vec4(-1.0, -1.0, 0.0, 1.0),
vec4(3.0, -1.0, 0.0, 1.0),
vec4(-1.0, 3.0, 0.0, 1.0)
};
gl_Position = positions[gl_VertexIndex % 3];
}
片段着色器:
void main() {
outFragColor = vec4(1,0,0,1);
}
viewport
包含什么?等等。如果没有看到你的代码,我们无法知道发生了什么事情。 - Nicol Bolas