我是用c ++和sdl,opengl编写游戏,但模板缓冲区似乎没有运行。我已使用此参数启用了模板位:
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1);
以下是代码:
glColorMask(0,0,0,0);
_stencil.EnableStencil();
_stencil.StencilFunc(GL_ALWAYS,2,1);
_stencil.StencilOp(GL_REPLACE,GL_REPLACE,GL_REPLACE);
glBegin(GL_QUADS);
glColor3f(0,0,0);
glVertex2f(_size.x,_size.y);
glVertex2f(_size.x,_size.y + _size.h);
glVertex2f(_size.x + _size.w,_size.y + _size.h);
glVertex2f(_size.x + _size.w,_size.y);
glColor3f(1,1,1);
glEnd();
glColorMask(1,1,1,1);
_stencil.StencilFunc(GL_EQUAL,2,1);
_stencil.StencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
for(int i = 0; i < _list.size(); i++)
{
_name.SetFontData(_fdata);
_name.SetLabelText(_list[i].name);
_name.SetLabelColor(255,255,255,255);
_icon.BindTexture( _list[i].data.ID, _list[i].data.width , _list[i].data.height );
/*if( _offsety + (_listGui.GetTextureInfo().height*i) + (_spacing_y*i) >= _size.y && _offsety + ((_listGui.GetTextureInfo().height*i)+_listGui.GetTextureInfo().height) + (_spacing_y*i) <= (_size.y + _size.h) )
{*/
if(i == 0)
{
_listGui.Render( _size.x + _spacing_x, _offsety );
_name.RenderText(_size.x + _spacing_x + _label.x,_offsety + _label.y );
_icon.Render( _size.x + (_iconPos.y + _spacing_x) , _offsety + _iconPos.y );
}
else
{
_listGui.Render( _size.x + _spacing_x, ( _offsety + ((_listGui.GetTextureInfo().height*i) + (_spacing_y*i) ) ) );
_name.RenderText(
_size.x + ( _label.x + _spacing_x),
_offsety + ( (_listGui.GetTextureInfo().height*i) + (_spacing_y*i) ) + _label.y
);
_icon.Render(
_size.x + (_iconPos.x + _spacing_x),
_offsety + _iconPos.y + (_listGui.GetTextureInfo().height*i) + (_spacing_y*i)
);
}
/*}*/
}_stencil.DisableStencil();
_stencil.EnableStencil()等于glEnable(GL_STENCIL_TEST); 同样适用于_stencil.DisableStecil();
答案 0 :(得分:1)
您在模板状态中使用的掩码值存在问题:
_stencil.StencilFunc(GL_ALWAYS,2,1);
掩码值由glStencilFunc()
的第3个参数给出,在应用任何模板逻辑之前,它与参考值和模板缓冲区中的值进行AND运算。用规范的语言:
掩码中最不重要的位与参考值和存储的模板值进行按位AND运算,得到的掩码值是参与由func控制的比较的值。
使用您使用的值,掩码值1将与参考值2进行“与”运算,这将导致有效参考值为0.在二进制:
2 = 00000010
1 = 00000001
2 & 1 = 00000000
这意味着在第一次传递中,您渲染的所有内容的模板值都设置为0,这是您已经清除它们的值。在第二遍中,将值与0进行比较,所有像素都将通过模板测试。
要使其正常工作,您需要更改参考值或掩码,以便不会屏蔽参考值。参考值为2时,掩码可能类似于2或3.但如果您只想使用一位模板,最简单的方法是使用1作为参考值。
这意味着您可以将第一次传递的设置更改为:
_stencil.EnableStencil();
_stencil.StencilFunc(GL_ALWAYS, 1, 1);
_stencil.StencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
并且第二次传递给:
_stencil.StencilFunc(GL_EQUAL, 1, 1);
_stencil.StencilOp(GL_KEEP, GL_KEEP, GL_KEEP);