在Vulkan/Opengl的视口外绘图

Mer*_*rni 2 opengl viewport vulkan

我有viewport一半是screen size/framebuffer.

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

我的scissor地区已经满了framebuffer

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

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

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

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

hid*_*yat 6

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

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

NVIDIA:

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

老答案:

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

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

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

  • 我不认为这是必要的.该规范似乎不允许保护带削波,因此执行此操作必须确保结果是否如果它们没有.我正在寻找Khronos内部讨论,我在这里提交了一个bug来添加CTS测试:https://github.com/KhronosGroup/VK-GL-CTS/issues/78. (4认同)