【发布时间】:2017-08-08 13:55:21
【问题描述】:
来自规范:
VK_KHR_maintenance1
允许在 slink::VkViewport::height 字段中指定负高度以执行 y 反转 剪辑空间到帧缓冲区空间的转换。这允许应用程序避免 必须在着色器中使用 gl_Position.y = -gl_Position.y 也针对 其他 API。
我的物理设备支持版本1.0.42,并且我启用了VK_KHR_maintenance1。
当我在 VkViewport 结构中设置负高度时,我没有收到任何验证错误/警告。
vkCmdSetViewport(vkContext.commandBuffer, 0, 1, &viewport);
但是我在屏幕上也看不到任何东西,它是黑色的,如果我删除 viewport 中的负值,一切都会按预期呈现。我需要做任何其他事情来使用VK_KHR_maintenance1 extension 翻转视口吗?我只是在屏幕上渲染一个带有全屏视口的红色四边形。
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);
}
【问题讨论】:
-
"但是我在屏幕上也看不到任何东西" 你在渲染什么?你的VS是什么样子的?你的投影矩阵是什么样的?
viewport包含什么?等等。没有看到您的代码,我们无法知道发生了什么。 -
@NicolBolas 添加了顶点和片段着色器