2015-09-27 3 views
-1

Я программирую игру в C++ и sdl, opengl, но буфер трафарета, похоже, не запускается. Я включил трафарет биты с этим параметром:Буфер трафарета SDL2 и 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

SDL_GL_STENCIL_SIZE принимает размер буфера трафарета в битах (типичный значение равно 8, по умолчанию 0). – Entalpi

ответ

1

Существует проблема со значением маски вы используете в своем трафарета состоянии:

_stencil.StencilFunc(GL_ALWAYS,2,1); 

Значение маски, которая задается 3 аргумента glStencilFunc(), является операция AND с эталонным значением и значением буфера трафарета до применения любой из схем трафаретов. На языке спецификации:

Индекса S мере значимы биты масок являются Побитовой операцией AND как с опорным и сохраненным значением трафарета, и полученные значения в масках являются те, которые участвуют в сравнении контролируемого FUNC.

Со значениями, которые вы используете, значение маски 1 будет операция AND с эталонным значением 2, что приводит к эффективному эталонное значение 0. В двоичном:

2  = 00000010 
1  = 00000001 
2 & 1 = 00000000 

Это означает, что в fist pass, значения трафаретов всего, что вы визуализируете, равны 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); 
+0

спасибо reto, я был очень полезен вашему ответу !! но проблема сохраняется, кажется, мне нужно переписать этот код для чистой копии. –

+0

проблема решена thx для ответов !!! я пропустил ясность и сделал несколько буферов. –

Смежные вопросы