Jump to content

Drawing alpha-textured quad using FFP


photo

Recommended Posts

Posted

Hello!

I'm trying to implement some kind of text rendering (via alpha-texture + UV set for every character). So, first thing I need to implement - quad rendering (with some alpha-texture assigned).

There is some code:

m_texture_renderer = TextureRender::create();   
m_texture_renderer->create2D( 1, 1 ); // because of. strange API
m_engine_render_state = Unigine::RenderState::get();

m_engine_ffp = Unigine::Ffp::get();

if ( auto img = Image::create("textures/anticircle.png"))
{
     m_anticircle_tex = Texture::create();
     m_anticircle_tex->create(img);
}

/*
... some code missing. in render() call:
*/

m_texture_renderer->setColorTexture(0, m_viewport_info.tex_color );
m_texture_renderer->enable();

m_engine_ffp->enable( Ffp::MODE_DEFAULT );
m_engine_ffp->setOrtho( m_viewport_info.w, m_viewport_info.h );

const float v[] = { 0.f, float(x-rx), float(x+rx), float(m_viewport_info.w),
                    0.f, float(y-ry), float(y+ry), float(m_viewport_info.h) };
                    
m_engine_render_state->clearStates(); //-- not sure - is it needed?
m_engine_render_state->flushStates();

//-- draw anticircle sprite
{
     const int old_src  = m_engine_render_state->getBlendSrcFunc();
     const int old_dest = m_engine_render_state->getBlendDestFunc();
     m_engine_render_state->setBlendFunc( RenderState::BLEND_SRC_ALPHA, RenderState::BLEND_ONE_MINUS_SRC_ALPHA );

          m_anticircle_tex->bindFragment(0);
          //m_anticircle_tex->render2D( x-rx, y-ry, x+rx, y+ry); // draw texture "as is", without color multiply

          m_engine_ffp->beginTriangles();
          m_engine_ffp->addTriangleQuads(1);
          
          m_engine_ffp->addVertex  ( v[1], v[5] ); m_engine_ffp->setTexCoord( 0.f, 0.f ); m_engine_ffp->setColor( col_argb );
          m_engine_ffp->addVertex  ( v[2], v[5] ); m_engine_ffp->setTexCoord( 1.f, 0.f ); m_engine_ffp->setColor( col_argb );
          m_engine_ffp->addVertex  ( v[2], v[6] ); m_engine_ffp->setTexCoord( 1.f, 1.f ); m_engine_ffp->setColor( col_argb );
          m_engine_ffp->addVertex  ( v[1], v[6] ); m_engine_ffp->setTexCoord( 0.f, 1.f ); m_engine_ffp->setColor( col_argb );
          
          m_engine_ffp->endTriangles();

          m_anticircle_tex->unbindFragment(0);

     m_engine_render_state->setBlendFunc( old_src, old_dest );      
}

m_engine_ffp->disable();
m_texture_renderer->disable();

This code works fine (draw colored quad with  "anticircle" inside) - but only on OpenGL mode. On direct3D - I cannot find any way to draw something with alpha (line/quad/textured quad/etc).
What should I fix to make it code portable from OpenGL to Direct3D?

Thanks a lot!

anticircle.png

×
×
  • Create New...