Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Haciendo un crop de texturas 2D

Iniciado por jbosch, 13 de Abril de 2012, 12:25:03 PM

« anterior - próximo »

jbosch

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:


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

Jesús Bosch Aiguadé
PLUNGE INTERACTIVE
------------------
Twitter:
@plungeint
@jboschaiguade
------------------
Facebook:
http://www.facebook.com/plungeinteractive

blau

#1
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....


jbosch

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();


Jesús Bosch Aiguadé
PLUNGE INTERACTIVE
------------------
Twitter:
@plungeint
@jboschaiguade
------------------
Facebook:
http://www.facebook.com/plungeinteractive

blau

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



jbosch

tienes toda la razón... ha funcionado perfecto. Sabes si tiene mucho coste de procesor el scissor test?
Jesús Bosch Aiguadé
PLUNGE INTERACTIVE
------------------
Twitter:
@plungeint
@jboschaiguade
------------------
Facebook:
http://www.facebook.com/plungeinteractive

blau

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

jbosch

impresionante el diagrama... ok, muchas gracias blau
Jesús Bosch Aiguadé
PLUNGE INTERACTIVE
------------------
Twitter:
@plungeint
@jboschaiguade
------------------
Facebook:
http://www.facebook.com/plungeinteractive






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.