Hola,
Tengo un objeto propio que se llama Scroll, que contiene un array de ScrollElements. Vamos, que es un scroll propio. El scroll funciona bien, permite arrastrar una lista de elementos (ya sean texturas, o spritefonts) de un lado para otro.
Básicamente el scroll hace esto (los cuadrados verdes son las texturas que contiene el Scroll en el array de ScrollElements, y el cuadro naranja es la UI o decoración del propio componente scroll:
(http://img201.imageshack.us/img201/9492/cropo.png)
Me gustaría que todo lo que esté fuera del área naranja no se dibuje. Haríais esto con un RenderTarget o se os ocurre una forma más sencilla de hacerlo?
gracias, y un saludo
1. Usa el scissor rectangle...
para habilitarlo tienes que crear un rasterizer state...
RasterizerState scissor = new RasterizerState() {ScissorTestEnable = true; }
GraphicsDevice.ScissorRectangle = CroppingBounds;
2. Puedes usar stencyl buffer... aunque es complicarse... un poquito
3. Puedes usar el viewport ...
GraphicsDevice.Viewport = new Viewport( CroppingBounds);
Aunque esto es mas bien para usarlo en conjuncion con una camara ... y que lo que pintes dentro del viewport no tenga nada que ver con lo que haya fuera....
Hola,
Muchas gracias, no había caido en el Scissor, y creo que es lo que debería ser más fácil. He probado a usarlo pero ocurre algo muy curioso... los cuadros de mi gráfico previo que quedan fuera del ScissorRectangle no se pintan nunca (lo cual es correcto), pero siguen sin pintarse aunque mueva la posición X de los cuadros. Se te ocurre a qué puede ser debido?
SharedGraphicsDeviceManager.Current.GraphicsDevice.RasterizerState = new RasterizerState() { ScissorTestEnable = true };
SharedGraphicsDeviceManager.Current.GraphicsDevice.ScissorRectangle = this.scrollableArea;
Texture2D texture = tmpElementTexture;
mySpriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.None, SharedGraphicsDeviceManager.Current.GraphicsDevice.RasterizerState);
//mySpriteBatch.Begin();
mySpriteBatch.Draw(texture, this.scrollableArea, Color.Orange);
for (int i = 0; i < scrollElements.Length; i++)
{
this.scrollElements[i].Draw(mySpriteBatch);
}
mySpriteBatch.End();
El SpriteSortMode.FrontToBack?
Tiene pinta de que el fondo machaca lo demas, ¿no?
Cambialo a Deferred o Inmediate, y si es eso, y quieres seguir usando FrontToBack ponle bien el Depth
tienes toda la razón... ha funcionado perfecto. Sabes si tiene mucho coste de procesor el scissor test?
que va... es todo por hardware... muy poquito...
el pixel shader se ejecuta... pero antes de hacer blend se descarta...
http://user.xmission.com/~legalize/book/preview/poster/pipeline-9.0.png
impresionante el diagrama... ok, muchas gracias blau