在Vulkan / Opengl的视口外绘图

时间:2018-01-29 21:13:52

标签: opengl viewport vulkan

我的Index()CalendarController的一半。

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

我的public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "ReferenceTables", // Route name "ReferenceTables/{action}/{tablename}/{id}", // URL with parameters new { controller = "ReferenceTables", action = "Index", id = @"" } // Parameter defaults ); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); } 区域是完整的RedirectToAction

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

我从左到右画一条远在 try{ String strText = Jsoup .connect("http://www.whatismyreferer.com") .referrer("http://www.google.com") .get() .text(); System.out.println(strText); }catch(IOException ioe){ System.out.println("Exception: " + ioe); } 之外的线。我期待只在视口内绘制线条。我已经在三张不同的图形卡上测试了这个,其中两张,我得到了我期待的结果。但是在第三个方面,该行是在viewport之外,但在screen size/framebuffer区域内。 哪一个结果在这里是正确的?据我所知,线条'应将两个顶点移动到外scissor个位置。不应该在它之外画出来。

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

他们正在讨论在viewport之外进行绘制,但这只是一些特殊情况,例如,如果你有一条很粗的线,我的线宽为viewport

2 个答案:

答案 0 :(得分:6)

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

  

如果线段的任何一个顶点位于剪辑体积之外,   线段可以被剪裁,计算新的顶点坐标   对于位于剪辑卷外部的每个顶点。修剪线   段端点位于原始线段和   剪辑音量的边界。

的Nvidia:

  

我们故意为维护2做了这个改变,允许   流行点和线。点剪切行为是可查询的但是   线裁剪行为不是,虽然我相信“首选”   行的行为是流行的。我们更改了NVIDIA驱动程序   去年从紧缩到无流行,甚至改变了CTS测试   允许这种新行为。所以这一切都按设计工作。

旧答案:

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

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

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

答案 1 :(得分:4)

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

与GL类似,视口仅定义从标准化设备坐标到帧缓冲坐标的变换。变换基于视口体积的宽度/高度/深度/原点,但该体积不定义剪切体积。数学在23.5 Controlling the Viewport部分中描述。

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