首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >glScissor的目的是什么?

glScissor的目的是什么?
EN

Game Development用户
提问于 2012-10-27 12:59:15
回答 5查看 50.4K关注 0票数 46

我知道它比模具测试更有效,但我是否正确地假设可以使用带有viewport的投影转换来实现相同的功能?

EN

回答 5

Game Development用户

回答已采纳

发布于 2012-10-27 16:38:46

它们是相辅相成的,而不是相互替代的。您几乎总是希望将剪刀矩形设置为与视口相同的值。

glViewport()指定从规范化投影空间到屏幕空间的转换。多边形被裁剪到投影空间的边缘,但其他绘图操作(如glClear() )则不然。因此,您可以使用glViewport()来确定屏幕空间视图区域的位置和大小,但是栅格化器仍然可以偶尔呈现该区域之外的像素。

这就是剪刀进来的原因。glScissor()定义了一个屏幕空间矩形,如果启用了剪刀测试,则不会在该矩形上绘制任何内容。

因此,例如,下面的代码将清除整个屏幕,即使视口设置为较大窗口的一小部分:

代码语言:javascript
运行
复制
glViewport(200,200,100,100);
glClear(GL_COLOR_BUFFER_BIT);

添加glScissor()并启用剪刀测试(默认情况下是禁用的)限制了清除。

代码语言:javascript
运行
复制
glViewport(200,200,100,100);
glScissor(200,200,100,100);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);

偶尔您会遇到一个实现,它会自动剪裁到viewport区域,但这违反了GL规范。

除此之外,剪刀矩形可以暂时限制绘图到视口的一个子矩形,特别效果,UI元素等。

票数 59
EN

Game Development用户

发布于 2019-01-12 14:42:45

我喜欢用视觉来解释这种东西。

在OnpenGL中,对于X和Y轴,我们有从-1到+1的2D坐标。

然后,该图像需要映射到窗口坐标。

让我们想象一下,我们有一个以深色为背景的窗口,我们有白色作为透明的颜色。

最常见的情况是有视口和剪刀覆盖整个屏幕。

但我们可以将它们设置为屏幕的一个较小的区域。

这些地区可能会有所不同。在下面的示例中,视口覆盖整个屏幕,而剪刀是较小的框。

在最后一种情况下,剪刀覆盖整个屏幕,而视口则是较小的框。注意,glClear会影响整个屏幕,因为这是由剪刀区域决定的。

票数 20
EN

Game Development用户

发布于 2012-10-27 18:19:52

它们在图形管道的两个完全不同的部分运行。

glViewport实际上指定了一个转换,它是一个在顶点着色器之后但在片段着色器之前发生的转换。如果它有助于了解它在概念上适合的位置,请考虑它是转换的一部分,这些转换用于将您的顶点数据从世界空间转移到屏幕空间(也就是说,它与模型视图和投影关系相对密切)。

剪刀测试发生在片段着色之后,以及当时发生的所有其他片段操作,如混合、深度/模板等。当片段被剪刀测试测试时,它已经完成了视口转换。

是的,剪刀测试的速度可以更快,因为它是一个简单的接受/拒绝,基于片段的屏幕空间坐标,而模板需要与模板缓冲区中的当前值进行比较,可能会增加或减少当前值,还需要考虑深度测试的结果,等等。

所以,把所有这些放在一起,你可以看到为什么存在剪刀测试。它使您能够将每个片段操作限制在屏幕的一个矩形部分,但不需要实际修改当前的视口转换。

票数 16
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/40704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档