glClearColor()不应该服从glViewport()设置的绘图区域吗?

joh*_*ers 5 opengl

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

glDisable(GL_DEPTH_TEST);

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

//... drawing commands
Run Code Online (Sandbox Code Playgroud)

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

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

Bar*_*icz 9

glClear一边:

像素所有权测试,剪刀测试,抖动和缓冲区写掩码影响操作glClear.

但是,glViewport说明了

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

如果我正确阅读参考文献,这是设计的; glViewport只是偏移了视口,它影响了栅格化基元的drawcalls,而glClear只是在整个帧缓冲区域上工作.

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

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

  • 应该至少提到`glScissor(...)`可以用来复制OP想要的行为.当然,提供了"GL_SCISSOR_TEST". (4认同)