Inicializando Direct3D – Parte 1/2

Publicado el Martes 20 julio 2010 en DirectX por Thund

¡Por fin, con todos ustedes… el más esperado, el desconocido, el novedoso… DirectX 11! Estoy de acuerdo, vaya chorrada de presentación, pero tenía que hacerlo, lo juro. El presente post y muchos de los sucesivos estarán centrados en Direct3D y DXGI, con pinceladas de DirectWrite o Direct2D, y en ellos trataré de explicar cómo están estructurados, cómo interactúan y cómo se utilizan para distintos propósitos, intercalando teoría y práctica para hacerlo más llevadero y comprensible. Para no complicarlo mucho, el código presentado será el básico e indispensable (en el próximo post ya le añadiré comprobaciones para hacerlo más robusto). Empecemos pues con un corto recorrido alrededor de los principales componentes de Direct3D y los cambios que ésta API ha sufrido respecto a DirectX 9. Como muchos recordaréis, lo primero que se hacía, a parte de la creación de la ventana, era llamar a la función Direct3DCreate9 a la que pasábamos la versión del SDK para obtener un puntero a una interfaz IDirect3D9. Esta última se encargaba de crear el manejador del dispositivo gráfico (IDirect3DDevice9) y la swap chain, y nos surtía de una serie de funciones para comprobar las posibilidades que el hardware ofrecía, de cara a dicha creación. Pues bien, este diseño se ha ido al carajo. Ya no existe una interfaz de entrada a la librería y toda la responsabilidad de comprobación de hardware ha sido desplazada a la API de DXGI. La swap chain ha dejado de estar medio oculta al usuario (tenías que ir específicamente a buscarla para darte cuenta de que estaba ahí) y pasa a primer plano bajo control de interfaces IDXGISwapChain. Como se puede comprobar por el prefijo, también ha pasado a dominio de DXGI. La interfaz del dispositivo (ahora ID3D11Device) se genera gracias a la función global D3D11CreateDevice y ya no se ocupa del envío de instrucciones de dibujo, o al menos no directamente, sino que ha sido dividida en 2 partes: el dispositivo y el contexto del dispositivo (ID3D11DeviceContext); mientras que el primero representa el adaptador en sí y actúa como fábrica de ciertos objetos, el segundo maneja las órdenes de renderizado. Como colofón, hace falta crear, al menos, un render target que apunte al back buffer de nuestra swap chain, y que usaremos para indicarle al device context dónde tiene que dibujar. Sí, Microsoft ha complicado un pelín las cosas. Vamos a verlo en mayor detalle, que así parece muy enrevesado.

 

DirectX Graphics Infrastructure

Nació con DirectX 10 para, según Microsoft, agrupar aquellas porciones de la API gráfica encargadas de realizar operaciones a bajo nivel en una librería independiente. Tales tareas son, por ejemplo, la enumeración de los dispositivos gráficos, el envío de los frames renderizados a los dispositivos de salida (presentación), manejo de transiciones de pantalla completa, etc. Ciertamente, DXGI ha cambiado poco desde que se lanzó, lo único que han hecho ha sido añadir funciones y unas cuantas chorradas* más con la versión 1.1, que aquí ni veremos ni usaremos. Identificaremos fácilmente estas extensiones, ya que los chicos de Redmond han tomado la genial decisión de diseño de añadir un "1" como sufijo, y deberemos tener cuidado de no mezclarla con la versión 1.0, esto es, no se deben usar interfaces o funciones de una y a continuación invocar las de la otra, de lo contrario vendrá Steve Ballmer y os gritará "Developers!" en un oído. Sí bueno, es la típica historia de terror que se cuenta a los niños cuando no se tiene ni puta idea de qué es lo que pasa, como el coco o el efecto invernadero, y con eso hay que conformarse :) . A continuación el conocido esquema sobre DXGI, por cortesía (o no) de Microsoft:

[Diagrama DXGI]

ID3D11Device

Realiza las mismas funciones que su antecesor, menos las relativas al renderizado, como Clear, Draw, Begin, End… Básicamente, es una fábrica de objetos o recursos asociados al dispositivo. Pueden generarse recursos compartidos entre varios dispositivos, pero sólo los podrá usar aquél que los creó. Echando un vistazo a su interfaz os daréis cuenta de que ya no están disponibles los métodos para la creación de vertex buffers e index buffers; de hecho, sí que están, lo que ocurre es que se han unificado los buffers en una única interfaz llamada ID3D11Buffer, que encapsula un objeto cuya funcionalidad puede configurarse en el momento de su creación, de la que se encarga el método CreateBuffer, para que se comporte como index, vertex o constant buffer. Un dispositivo puede dividirse internamente en 2 capas: la capa principal o núcleo (Core Layer), que existe siempre por defecto, y la capa de depuración (Debug Layer), que puede activarse mediante el flag D3D11_CREATE_DEVICE_DEBUG, cuando creamos el manejador del dispositivo. Dependiendo de cómo tengamos configurado el panel de control de DirectX, la capa de depuración nos mostrará una serie de mensajes muy últiles en la ventana de Output de Visual Studio. Cabe destacar que la interfaz ID3D11Device es free-threaded (o thread-safe, como más os guste), lo que significa que se puede llamar a sus métodos desde cualquier hilo simultáneamente (el número de concurrencias dependerá del driver). Al igual que en anteriores versiones, podemos crear un dispositivo de referencia que emulará mediante software todas las características de DirectX. Adicionalmente, existe otro tipo de dispositivo llamado WARP (Windows Advanced Rasterization Platform), que también implementa mediante software (con mucho mejor rendimiento, según tengo entendido) las capacidades de Direct3D 11. Para ver las limitaciones de ambos emuladores echad un ojo a la documentación.

ID3D11DeviceContext

La interfaz del dispositivo antes mencionada ha sido dividida en 2 partes, de manera que la responsabilidad del renderizado ahora recae en los llamados "contextos del dispositivo". Los contextos son creados por el propio dispositivo y pueden ser de 2 tipos: inmediatos y postergados (es mi traducción de deferred). El concepto de "contexto" se refiere al modo de tratar las órdenes de renderizado y cambios de estado que se envían al dispositivo. Mientras que en un contexto inmediato los comandos son transmitidos directamente al dispositivo, en un contexto postergado se genera una cola de comandos que serán ejecutados más tarde utilizando el contexto inmediato. Esto permite utilizar una arquitectura multihilo para renderizar en paralelo aunque, al final, acabe realizándose en serie. Sólo puede existir un contexto de tipo inmediato por dispositivo, e infinitos contextos postergados. Para saber a qué tipo pertenece un determinado contexto, podemos usar el método GetType. Al contrario que la interfaz ID3D11Device, ID3D11DeviceContext no es thread-safe, sólo puede usarse cada instancia desde un único hilo simultáneamente.

IDXGISwapChain

Anteriormente, para acceder a la cadena de intercambio de buffers de salida (swap chain en adelante), teníamos que utilizar el método GetSwapChain de la interfaz IDirect3DDevice9, obteniendo así un puntero a la interfaz IDirect3DSwapChain. Su existencia pasaba inadvertida, aunque la utilizáramos sin saberlo al suministrar la estructura D3DPRESENT_PARAMETERS (cuyo equivalente ahora es DXGI_SWAP_CHAIN_DESC) o al llamar al método Present. Con el diseño actual, la swap chain pasa a un discreto primer plano y no sólo eso sino que, como mencioné en varias ocasiones, las interfaces relacionadas con la misma han sido movidas a la librería de DXGI.

ID3D11RenderTargetView

Antes de explicar el significado de ésta interfaz en concreto, creo que es necesario dar a conocer algunos detalles acerca de la estructura de DirectX 11. Existen los llamados "recursos", que no son más que zonas de memoria con datos que son accesibles desde la pipeline de Direct3D. Tales recursos, encapsulados en derivadas de ID3D11Resource, son generados por la interfaz del dispositivo y normalmente contienen datos "en bruto", en forma de buffers (ID3D11Buffer), o texels, formando texturas (ID3D11Texture1D, ID3D11Texture2D ó ID3D11Texture3D); hay varios tipos de recurso más o, mejor dicho, subtipos, que han sido añadidos con la versión 5.0 de los shaders, tales como StructuredBuffer, que no describiré hasta que lo necesitemos para algo en el futuro. La cuestión es que, para manipular tales datos de memoria, necesitamos una "vista", que actúa como canal de acceso; en función del tipo de recurso, tendremos que elegir un tipo de vista u otro, esto es, una u otra interfaz derivada de ID3D11View. ¿Que por qué me pongo a hablar de esto aquí en vez de crear una sección de introducción para los recursos, otra para las vistas, etc.? Pues porque para fusilar y traducir la documentación de referencia ya tenéis la MSDN y el infalible traductor online de Microsoft. Volviendo a lo que nos ocupa, uno de los tipos de vista que nos permiten dibujar sobre una textura (nuestro back buffer es precisamente eso, una textura 2D) es el representado por ID3D11RenderTargetView. Para crearla hay que usar el método CreateRenderTargetView del dispositivo, al cual hay que suministrar la textura (nuestro back buffer, por ejemplo, obtenido mediante el método GetBuffer de la interfaz de la swap chain) y, opcionalmente, una estructura de configuración. Las vistas son objetos pasivos, tan sólo tienen un método o propiedad que nos devuelve sus descripciones. Veremos más tipos de vista en breve, cuando hable del depth y el stencil buffer.

Sé que el principio del post prometía sangre, pero dado que soy un cenutrio incapaz de condensar tanta información para hacer posts agradables y ligeros, me veo obligado a partirlo en 2. No tardaré mucho en publicar la segunda parte, que es la que contiene el ejemplo de código, que nadie se impaciente.

 

*Para los puristas, cuando digo "chorradas" quiero decir "funcionalidad de uso poco frecuente o de propósito muy específico", aunque suponga una puta revolución tecnológica.

Etiquetas: ,

20 Respuestas a 'Inicializando Direct3D – Parte 1/2'

Suscríbete a los comentarios con RSS o TrackBack a 'Inicializando Direct3D – Parte 1/2'.

  1. mijgan dijo:

    I would like to exchange links with your site endlessgame.elalumbramiento.org
    Is this possible?

    on agosto 13th, 2010 at 21:33

  2. Thund dijo:

    Hi mijgan, that’s perfectly possible. What is / will be your blog about?

    on agosto 14th, 2010 at 19:33

  3. Dragon City Hack Tool Free Download – Dragon City Hack Pc 2018…

    blog topic…

    on diciembre 16th, 2018 at 23:32

  4. If you’re into Forex trading, obtaining a Forex products review is really what
    you have to be checking out, particularly when you’re
    searching for the most effective Forex robots available.
    Of course, one that is skilled at analyzing the market can profit without having to
    use Forex software but that could be really unwise.
    If you don’t want to glance at the repeated questing and strategizing on the
    way to level up faster hanging around, you can also obtain a good leveling guide in Wo – W that will help you level up faster.

    on diciembre 17th, 2018 at 2:17

  5. Whether allowing up a couple of extra minutes playing with the kids, washing dishes,
    or if you dare leave work early, your time
    and effort is something. Receiving gifts which do not cost anything
    is an excellent way to save money. A person handing out a 2 yr old
    laptop computer is likely this as it was broken (even if
    they do not say).

    on diciembre 17th, 2018 at 7:29

  6. In our times your young daughters can give them
    a go on while using help of browser-based doll spice up games.
    These kinds find that will get you hooked because they can be very addictive.
    Simply saying that on the web has become popular is a massive
    understatement.

    on diciembre 17th, 2018 at 7:58

  7. frc9.us dijo:

    Apart in the chat rooms, instant messengers and electronic mqils suitable for communication and dialogue beyond tuf include the
    emerfging innovations that assist man build opportunities for interaction. Readers whose interest iss gained
    at 1st will miss interest watching for continuations or updated
    articles. As for businesses, they found blogs to be helpful by bringing
    back clients they had by showing them fresh and new content
    not seen elsewhere.

    on diciembre 17th, 2018 at 13:55

  8. It’s why Tomb Raider: Underworld, despite being the top game inside the franchise, ends up being more entertaining than its imperfections suggests it right-fully deserve.
    Now you will find a save game every 5 minutes and
    after a battle your quality of life restores returning to
    100%. Just as one question for you is answered, another
    is mentioned, much in the same style as a few of the more popular shows including Lost, Prison Break, or 24.

    on diciembre 17th, 2018 at 14:17

  9. The quick way to access those topics should be to utilize forum’s search tool.

    The first important thing is to keep a very positive
    and pro-active attitude towards direct selling.
    This is a way you can build a poker bankroll without investing far from time.

    on diciembre 17th, 2018 at 14:44

  10. Quit worrying an advanced gaming freak losing sleep over damaged
    Xbox game CDs. Whatever the occasion, you might find yourself being forced
    to obtain a gift for somebody you know. This is probably not that which you expected me to state,
    but that is truly instrumental (no pun intended) for a success.

    on diciembre 17th, 2018 at 16:13

  11. The information of each and every top 100 HR Experts will probably be displayed because leading HR Experts within their respective
    job rule or question group, online specifically developed to show
    the information with the top 100 HR Experts in each job rule group
    and job question group. They may find that
    there exists material and comments which aren’t a representation products the company represents.
    You just have to take your laptop along when looking for trip to work with your
    office computer.

    on diciembre 17th, 2018 at 16:41

  12. Moreover, it is always better to talk to
    experts if you have any plan that can be purchased at affordable
    rates. Wood, steel, aluminum, fiberglass are extremely popular and also comes in affordable
    rate. As wireless devices need no drilling anyplace for the installation, no disturbance occurs with the aesthetics of the house.

    on diciembre 18th, 2018 at 4:12

  13. Online gaming rental stores attempt a vast searchable database that allows you to assess the content, rating,
    comments and playability factor of each and every game.

    This is the way to acquire that game prior to it being released and check it out for
    many aspects. This is because focusing enables you to stay off mistakes hence,
    making the sports more pleasurable.

    on diciembre 18th, 2018 at 5:21

  14. Software applications can not be copied directly from Mac Operating System X but has to be written and compiled designed for i-Phone
    Operating System. It’s just plain old wise practice being cautious, wary and protective of your children.
    In case your company is changing their primary address,
    your rental company can help you move and hang up up all of your rental
    equipment at the new address.

    on diciembre 18th, 2018 at 6:48

  15. tally 6.4.4 dijo:

    All you need is the overall game console, remote,
    a controller, sensor bar and other accessories that come being a set along with the latest games.
    These games are incredibly educational which enable it to even prepare children to get a better future.
    It’s not about teaching riding or horse care skills however the thing is that it’s been tried
    and tested that simply being inside vicinity
    of horses changes our brainwave patterns.

    on diciembre 19th, 2018 at 4:06

  16. These days, there are lots of sources that make an effort to provide wiring diagrams for the mechanic online.

    However, many of these have to have a lengthy learning period and considerable practice to be effective.
    With modern tools it can be very hard to download free smartphone apps.

    on diciembre 19th, 2018 at 14:17

  17. filmora 846 dijo:

    You never know, maybe you might even collect many free samples for
    soaps, shampoos or creams that could probably endure two months; when you think of
    it this is a great amount you will likely have saved. The good thing is that you have numerous places from where one will be
    able to get this stuff. But unless you just are
    actually driving in from Warm Springs (Nevada) on the Extraterrestrial Highway (SR 375), ignore this one.

    on diciembre 20th, 2018 at 16:02

  18. Leo dijo:

    Just stun the healer, pop the Smoke Bomb, contact a warrior or two, and relish the undisturbed killing spree.
    The riding streak soon experienced a stumble and Pat was
    suspended in the sports for up to a few years,
    well approximately; until he made his comeback in 2003-2004.
    However, the dominance of technology has somewhat
    drawn us closer to its inventions and innovations.

    on diciembre 21st, 2018 at 10:03

  19. Likewise the laptop keyboard is the same size because Mac – Book, which is an amazing achievement if the whole thing only weighs 1.
    Over the last three decades consumer electronics have raised in leap & bounds.
    You say, boo-hoo, you downloaded something from the torrent site, you need to
    know better.

    on diciembre 25th, 2018 at 9:02

  20. Farming – Runescape has a lot of interesting skills and farming is unquestionably among them.
    Therefore, the necessity to download PC games on the Internet has currently be a little
    more important. In general, the mouse provides faster movements and
    much more precise control compared to a controller pad.

    on febrero 15th, 2019 at 18:25

Publica un comentario