繁体   English   中英

在Vulkan / Opengl的视口外绘图

[英]Drawing outside the viewport in Vulkan/Opengl

我的viewportscreen size/framebuffer一半。

x,y,w,h = 0,0,512,512

我的scissor区域是完整的framebuffer

x,y,w,h = 0,0,0 1024,512

我从左到右画一条远离viewport的线。 我期待只在视口内绘制线条。 我已经在三张不同的图形卡上测试了这个,其中两张,我得到了我期待的结果。 然而,在第三个线上,线被绘制在viewport外部,但在scissor区域内。 哪一个结果在这里是正确的? 据我所知,线的两个顶点应移动到外viewport位置。 不应该在它之外画出来。

如果您在本网站上阅读了10号陷阱: https//www.opengl.org/archives/resources/features/KilgardTechniques/oglpitfall/

他们正在谈论在viewport口外绘图,但这只是一些特殊情况,例如你有一条很粗的线,我的线宽是1

编辑:在KhronosGroup讨论后:从规范Vulkan 1.0.68:

如果线段的顶点中的任何一个位于剪辑体积之外, 可以剪切线段,为位于剪辑体积之外的每个顶点计算新的顶点坐标。 剪切的线段端点位于原始线段和剪辑体积的边界上。

NVIDIA:

我们故意对维护2进行此更改,以允许无弹出点和线。 点剪切行为是可查询的,但行剪切行为不是,但我相信行的“首选”行为是无弹出的。 我们去年将NVIDIA驱动程序从严密裁剪更改为无弹出,甚至更改了CTS测试以允许这种新行为。 所以这一切都按设计工作。

老答案:

视口定义了从标准化设备坐标到窗口坐标的转换。 视口转换不会进行任何裁剪。

但是,裁剪确实发生在NDC空间之前,视锥体裁剪确保没有顶点可以落在视口之外。 如果您使用正交投影,剪辑空间和NDC空间是相同的。 因此[-1,1]之外的所有内容都将被裁剪。 如果你没有做任何特殊情况,应该剪切opengl链接谈论顶点。

如果您的两个图形卡在视口内部而另一个在外部,则可能是驱动程序错误。 如果您使用的是相当新的Vulkan,那很可能就是这种情况。

编辑:我的答案在技术上是正确但没有用。 视口变换本身不定义剪辑体积或剪刀。 但由于剪切到视锥体([-w,+ w]为x和y,[0,+ w]为z),进入视口变换的所有(x,y)值都将在[-1, 1],并且不会被转换为落在定义视口的矩形之外。

与GL类似,视口仅定义从标准化设备坐标到帧缓冲坐标的变换。 变换基于视口体积的宽度/高度/深度/原点,但该体积未定义剪裁体积。 23.5节“ 控制视口”中介绍了数学运算。

在Vulkan中,您还可以在VkPipelineViewportStateCreateInfo:: pScissorsvkCmdSetScissor为每个视口指定帧缓冲坐标中的剪刀矩形。 此矩形外的像素删除。 但您必须自己设置剪刀矩形,并且不必匹配视口体积。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM