отрисовываю куб с текстурой, в текстуре альфа канал, везде одинаковая прозрачность около 0.5
включаю альфа тест (типа VB эквивалент кода)
- Код: Выделить всё
Call dev.SetRenderState(D3DRS_ALPHAREF, &H0)
Call dev.SetRenderState(D3DRS_ALPHATESTENABLE, 1)
Call dev.SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER)
рендерится неправильно, видны лишь часть греней куба, когда должны быть видны все.
если отключить запись в ZBuffer все норм.
если не использую текстуру, а использую D3DFVF_DIFFUSE вертексов, где одна грань полностью прозрачна, остальные полностью нет, то альфатест работает нормально, то есть я вижу "внутренности" куба.
в чем отличие?
в данном случае конечно можно просто выключить запись в ZBuffer, но это не всегда приемлемо.
если альфа текстуры содержит как полностью прозрачные так и полностью непрозрачные участки, выключать запись в ZBuffer нельзя. а альфа тест работает опять таки неправильно.
альфабленд и текстурирование
- Код: Выделить всё
Call dev.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
Call dev.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
Call dev.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
Call dev.SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
Call dev.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
Call dev.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
Call dev.SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
Call dev.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
Call dev.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
Call dev.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);