• Advertisement
Sign in to follow this  

D3DXSprite + Scissor Rect

This topic is 1785 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts



I'm experiencing a problem when trying to use the DX9 ScissorRect to clip my gui objects content (e.g. a graphic that is going beyond the borders of my window). Now, I'm using the ID3DXSprite-interface to render the objects. My problem is this: Whenever I set the scissor rect using Device->SetScissorRect(), only the last set scissor rect gets applied, and everything gets clipped to this area. Device-state is set, I checked with PIX and NPerfHUD, its simply that when calling sprite.end(), the last set scissor rect will be used to clip all of the batched draw-calls. Here is my gui render loop:



    //loop all registered objects
    for(vector<GuiObject*>::iterator jj = m_vObjects.begin();jj!=m_vObjects.end();++jj)
        //aquire render data
        const vector<RenderData>& vData =  (*jj)->GetRenderData();
        //draw each objects subpart
        for(vector<RenderData>::const_iterator ii = vData.begin(); ii!=vData.end();++ii)
            //check for label
            if(ii->sLabel.size() == 0)
                //check for texture
                if(ii->pTexture == NULL)
                    //check for filename
                    if(ii->sFileName.size() == 0)
                        //draw from layout
                        //draw from file
                    //draw from texture

                //setup sprite
                //draw label
                m_pFontWriter->DrawTextW(ii->rDestRect,ii->sLabel.c_str(), ii->labelFlags, ii->z);
        //set viewport to clip objects content
        //todo: use only one viewport and Set() it
    //reset viewport, uncommenting will show everything

m_pSprite->Draw() will issue a ID3DXSprite draw call, m_pSprite->ApplyViewport() will call SetScissorRect to the device. Now, if I uncomment the last two lines, everything will be shown - but no clipping anywhere.


I figured out a way to get it to work: If I call sprite->end() and sprite->begin() when applying the viewport, everything will work fine, since all prior draw-calls gets issued to the device. This is not an option since it would be too slow; or lets say so: I want to use the speed the sprite-interface offers me by batching all of my draw calls.


Is there any way to use a ScissorRect for a certain sprite->draw() call without having to end() and begin() the sprite before?


EDIT: Problem solved. There really is no way to regularly change the scissor rect between sprite->draw() calls, but calling sprite->flush() before changing the rect works, and almost as fast as before (163 FPS original, 148 FPS begin()->end(), and 159 FPS; I know FPS is a bad measure but just to give you an idea).

Edited by The King2

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement