OpenGL模板测试无法按预期工作

时间:2015-07-31 03:13:35

标签: c++ opengl

OpenGL模板测试在旧的OpenGL版本中无法正常工作。所以我使用以下测试呈现代码来找出错误:

int imgWidth = 256;
int imgHeight = 256;
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);

glEnable(GL_STENCIL_TEST);

// Render invisible triangle.
glColorMask(false, false,false,false);
glStencilFunc(GL_EQUAL, 0, 0x1);
glStencilMask(1);
glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT);
glColor4ub(0,0,0,0);
glBegin(GL_TRIANGLES);
 glVertex2d(0,0);
 glVertex2d(128,128);
 glVertex2d(128,0);
glEnd();

// Enable color rendering
glColorMask(true,true,true,true);

// Render renctangle with a triangle hole in it.
glStencilMask(0xff);
glStencilFunc(GL_EQUAL, 0x0, 0xff);
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
glColor4ub(255,0,0,0);
glBegin(GL_QUADS);
 glVertex2d(0,0);
 glVertex2d(imgWidth,0);
 glVertex2d(imgWidth,imgHeight);
 glVertex2d(0,imgHeight);
glEnd();

上面的代码在我的OpenGL 3.3机器中按预期工作。但是在OpenGL 1.4机器上失败了,在renctangle中没有漏洞。我试图修改模板相关参数只是为了发现OpenGL似乎完全忽略了模板测试。无法弄清楚原因。

1 个答案:

答案 0 :(得分:1)

正如@genpfault所说 glGetIntergerv(GL_STENCIL_BITS,位)得到0个模板位。这解释了发生了什么。

解决问题的方法:在Windows下,在创建渲染上下文时,将 PIXELFORMATDESCRIPTOR cStencilBits 更改为所需的位数(例如8)。

然而,这并不能解释为什么在OpenGL verion 3.3下模板工作正常。更高版本的OpenGL可能会强制模板位非零。有人可以对此有所了解吗?