6
glViewport(x(), y(), width(), height());

glDisable(GL_DEPTH_TEST);

glClearColor(0, 0.3, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);

//... drawing commands

绘图正确地发生在窗口的一小块区域中,由glViewport(x(), y(), width(), height())

然而,由 glClearColor() 设置的背景颜色会影响整个窗口,即使这是在调用 glViewport() 之后设置的。为什么?

4

2 回答 2

12

一边glClear

像素所有权测试、剪刀测试、抖动和缓冲区写入掩码会影响glClear.

然而,glViewport指出

glViewport指定 x 和 y 从标准化设备坐标到窗口坐标的仿射变换。

如果我正确阅读了参考资料,这是设计使然;glViewport仅偏移视口,这会影响光栅化图元的绘制调用,而glClear仅适用于整个帧缓冲区区域。

完整的规范(4.3)似乎同意这一点:

§17.4.3 GL 提供了一种将特定缓冲区中每个像素的部分设置为相同值的方法。

于 2013-09-16T14:37:36.730 回答
3

如果只想清理一小块区域,则需要启用 GL_SCISSOR_TEST。试试下面的代码,希望对你有帮助。

glEnable(GL_SCISSOR_TEST);
glScissor(100, 100, 100, 100);
glClearColor(1, 1, 0, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_SCISSOR_TEST);
于 2021-11-03T04:01:54.403 回答