Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda Con Render Targets En Direct3d

Iniciado por [EX3], 21 de Marzo de 2006, 05:01:58 AM

« anterior - próximo »

[EX3]

 Estoy implementando actualmente el soporte de RenderTargetsb en la dx_lib32. Encontre hace tiempo un ejemplo que demuestra de forma sencilla y clara el uso de RenderTargets.

He visto que usa como superficie de destino para las operaciones de dibujo la superficie de una textura. En este caso se trata oviamente de una superficie de potencia 2 (256x256 por ejemplo). Como veo que el destino de un render target es una mera superficie Direct3DSurface8 pense que aceptaria superficies no potencia de 2 (320x240 por ejemplo). El programa no me funciona con una superficie no potencia de 2 y en la documentacion del SDK no veo restriccion alguna sobre ello por lo que me queda la duda.

Mi pregunta es, soportan los Render Target superficies no pontencia de 2? De no ser asi para no seguir perdiendo el tiempo en ello y seguir con la implementacion en potencia 2.

Salu2 y gracias ;)
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

BeRSeRKeR

 No tienes por qué tener problemas a la hora de crear RTs que no sean potencia de dos, siempre que la aceleradora lo soporte. Para saberlo, puedes utilizar el "caps viewer" y ver si el flag D3DPTEXTURECAPS_NONPOW2CONDITIONAL está activado. Lo que indica ese flag es que bajo ciertas circunstancias, puedes utilizar texturas que no sean potencia de dos. Esas circunstancias son (sacado de la documentación de DX):

CitarD3DPTEXTURECAPS_NONPOW2CONDITIONAL

    D3DPTEXTURECAPS_POW2 is also set, conditionally supports the use of 2D textures with dimensions that are not powers of two. A device that exposes this capability can use such a texture if all of the following requirements are met.

        * The texture addressing mode for the texture stage is set to D3DTADDRESS_CLAMP.
        * Texture wrapping for the texture stage is disabled (D3DRS_WRAP n set to 0).
        * Mipmapping is not in use (use magnification filter only).
        * Texture formats must not be D3DFMT_DXT1 through D3DFMT_DXT5.

    If this flag is not set, and D3DPTEXTURECAPS_POW2 is also not set, then unconditional support is provided for 2D textures with dimensions that are not powers of two.

    A texture that is not a power of two cannot be set at a stage that will be read based on a shader computation (such as the bem - ps and texm3x3 - ps instructions in pixel shaders versions 1_0 to 1_3). For example, these textures can be used to store bumps that will be fed into texture reads, but not the environment maps that are used in texbem - ps, texbeml - ps, and texm3x3spec - ps. This means that a texture with dimensions that are not powers of two cannot be addressed or sampled using texture coordinates computed within the shader. This type of operation is known as a dependent read and cannot be performed on these types of textures.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

[EX3]

 Gracias por la informacion :)

Veo que esta "capacidad" se atañe solo a las texturas y no a las surfaces en si. Se le puede asignar como destino una surface "huerfana" a un RenderTarget o tiene que ser obligatoriamente una surface de una Textura? Por las pruebas que he intentado me parece que no es posible.

Mi idea era la de tener una surface exclusiva del tamaño que fuese para el Render Target (a modo de backbuffers secundarios) y que luego cuando lo necesitase asignarla a una textura (escalando la surface al tamaño de la textura, claro) para poder pintar sobre el Backbuffer del Device.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

[EX3]

 Bien, traigo una pequeña duda que me esta frenando en el uso para el que tenia pensado utilizar los RenderTarget.

He logrado implementarlos y que funcionen con normalidad. El problema me viene en una bajada FPS salvaje cuando trato de hacer una cosa similar a la siguiente:

Bucle principal
{
   Abrir_RenderTarget()
       LimpioRenderTarget()
       PintoTextura()
       PintoTexto()

   Cierro_RenderTarget()

   PintoRenderTarget()

   PintoBackbuffer() <- Flip() o Present() en DirectX -

}

Por norma realizar todas esas acciones directamente sobre el backbuffer me alcanza una velocidad de 720 fps mas o menos, pero si voy pintando en el RenderTarget en cada vuelta del bucle me baja a 17fps. Mi pregunta es, le cuesta tanto a D3D abrir y cerrar un RenderTarget como para no pensar en hacerlo dentro del bucle principal?

Mi idea era usar los RenderTarget como superficies auxiliares para poder trabajar indivualmente elementos como representacion de escenas secundarias sobre la escena principal (una secuencia escalada a un tamaño de 128x128 sobre la escena principal a 640x480 por ejemplo) o para facilitar la tarea de crear superficies donde simular espejos, etc... vamos, que tenia pensado unos cuantos usos a esta tecnica y viendo esto me estoy quedando a dos velas :(

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






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.