2013-10-14 2 views
1

Я реализую слой эмуляции. Все работает иначе, кроме материала трафарета (мои тени перекрываются).Параметры трафарета между DirectX и OpenGL

Я просто интересно, если я делаю вещи логически - если я делаю соответствующие выводы/допущения:

case D3DRS_STENCILENABLE: 
    glAble(GL_STENCIL_TEST, value); 
    break; 
case D3DRS_STENCILFAIL: 
    sStencilFail = glFromD3DSTENCILOP((D3DSTENCILOP)value); 
    AssertGL(glStencilOp(sStencilFail, sStencilPassDepthFail, sStencilPassDepthPass)); 
    break; 
case D3DRS_STENCILZFAIL: 
    sStencilPassDepthFail = glFromD3DSTENCILOP((D3DSTENCILOP)value); 
    AssertGL(glStencilOp(sStencilFail, sStencilPassDepthFail, sStencilPassDepthPass)); 
    break; 
case D3DRS_STENCILPASS: 
    sStencilPassDepthPass = glFromD3DSTENCILOP((D3DSTENCILOP)value); 
    AssertGL(glStencilOp(sStencilFail, sStencilPassDepthFail, sStencilPassDepthPass)); 
    break; 
case D3DRS_STENCILFUNC: 
    sStencilFunc = glFromD3DCMPFUNC((D3DCMPFUNC)value); 
    AssertGL(glStencilFunc(sStencilFunc, sStencilRef, sStencilValueMask)); 
    break; 
case D3DRS_STENCILREF: 
    sStencilRef = value; 
    AssertGL(glStencilFunc(sStencilFunc, sStencilRef, sStencilValueMask)); 
    break; 
case D3DRS_STENCILMASK: 
    sStencilValueMask = value; 
    AssertGL(glStencilFunc(sStencilFunc, sStencilRef, sStencilValueMask)); 
    break; 
case D3DRS_STENCILWRITEMASK: 
    AssertGL(glStencilMask(value)); 
    break; 

Ниже используются выше. glAble() просто является оболочкой для glEnable/glDisable.

static GLenum glFromD3DCMPFUNC(D3DCMPFUNC value) { 
    return(GL_NEVER + value - 1); 
} 

static GLenum glFromD3DSTENCILOP(D3DSTENCILOP value) { 
    switch (value) { 
    case D3DSTENCILOP_KEEP: return(GL_KEEP); 
    case D3DSTENCILOP_ZERO: return(GL_ZERO); 
    case D3DSTENCILOP_REPLACE: return(GL_REPLACE); 
    case D3DSTENCILOP_INVERT: return(GL_INVERT); 
    case D3DSTENCILOP_INCRSAT: 
    case D3DSTENCILOP_INCR: 
     return(GL_INCR); 
    case D3DSTENCILOP_DECRSAT: 
    case D3DSTENCILOP_DECR: 
     return(GL_DECR); 
    default: Assert(!"Unsupported!"); return(0); 
    } 
} 
+0

Какие версии D3D и GL вы таргетирования? Возможно, вам не удастся выполнить трафарет D3D9 в версиях GL старше 2.0, которые только открывают двусторонние трафаретные операции через расширения. Я бы ожидал увидеть что-то в своем эмуляторе, который обрабатывает 'D3DRS_Two_Sided_StencilMODE', а затем отправляет такие вещи, как' D3DRS_CCW_STENCILFAIL', в 'glStencilFuncSeparate (...)' соответствующим образом. Это добавляет довольно много осложнений, но есть обычные варианты использования для обработки теста трафарета переднего/заднего по-разному. –

+0

DirectX 8 - не работает двусторонний. OpenGL 3. –

ответ

1

Фигурные это, я забыл установить мой PIXELFORMATDESCRIPTOR:

pfd.cStencilBits = 8; 
1

Есть несколько вещей, которые могут пойти не так.

  • Вы делаете то же самое для incr и incr_sat. Используется ли тестовый код? Gl требует расширения для насыщения. Это не одно и то же.
  • С помощью старого кода d3d проверьте, что рекордер трафарета равен 0..255. Может быть разница в том, как обрабатывается параметр> 255 или < 0 (зажим против и)
  • Двойная проверка, что d3d не делает двустороннюю. И помните, что отбраковка перевернута.
  • Двойная проверка прозрачного кода трафарета!

Хорошей новостью является то, что это должно работать с базовым переводом таблицы. Нет фундаментальной проблемы API (я делал это раньше). Это просто требует большого тестирования, потому что пространство параметров велико.

+0

В моем коде не используется насыщенность. И мои значения равны 0 или 1 (так что это не проблема прижима). У меня D3D как не двусторонний, и что отбраковка отличается - я вижу тени, но они перекрываются. Трафарет определенно очищается, если бы его не было, не было бы теней для начала. Есть ли другие вещи, за которыми я мог бы следить? –

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