A menudo, una función de hardware similar se expone a través de DirectX y OpenGL usando una terminología diferente.
Por ejemplo:
Constant Buffer / Uniform Buffer Object
RWBuffer / SSBO
Estoy buscando un cuadro exhaustivo que describa qué terminología de DirectX se utiliza para referirse a qué concepto de OpenGL, y viceversa.
¿Dónde puedo encontrar ese recurso?
Respuestas:
No he podido encontrar este gráfico en la web, así que hice uno aquí. (Todos, siéntanse libres de agregar, elaborar o corregir cualquier error. Algunos de estos son solo las mejores conjeturas basadas en una comprensión parcial de la API y el hardware interno)
Conceptos básicos de API
Sombreadores
Geometria y Dibujo
Tampones y Texturas
Procesar objetivos
Consultas
Calcular sombreadores
Otros recursos
fuente
Aquí hay una lista no exhaustiva de Vulkan y DirectX 12. Esto se combina usando criterios similares a los de Nathan.
En general, ambas API son sorprendentemente similares. Cosas como las etapas de sombreador permanecen sin cambios desde DX11 y OpenGL. Y obviamente, DirectX usa vistas para hacer que las cosas sean visibles para los sombreadores. Vulkan también usa vistas, pero son menos frecuentes.
El comportamiento de visibilidad del sombreador difiere un poco entre los dos. Vulkan usa una máscara para determinar si un descriptor es visible para las distintas etapas del sombreador. DX12 maneja esto un poco diferente, la visibilidad de los recursos se realiza en una sola etapa o en todas las etapas.
Rompí el conjunto de descriptores / parámetros del parámetro raíz lo mejor que pude. El manejo del descriptor es una de las áreas que varían mucho entre las dos API. Sin embargo, el resultado final es bastante similar.
Conceptos básicos de API
La capa WSI de Vulkan proporciona imágenes para la cadena de intercambio. DX12 requiere recursos de creación para representar la imagen.
El comportamiento general de la cola es bastante similar entre ambos. Hay un poco de idiosincrasia al enviar desde múltiples hilos.
Intentaré actualizar a medida que recuerdo más cosas ...
Comando Buffer y Pool
La palabrería sobre el grupo de comandos / asignador de documentos de Vulkan / DX12 establece el comportamiento en palabras muy diferentes, pero el comportamiento real es bastante similar. Los usuarios son libres de asignar muchos buffers / listas de comandos del grupo. Sin embargo, solo se puede grabar un búfer / lista de comandos del grupo. Las agrupaciones no se pueden compartir entre subprocesos. Por lo tanto, varios subprocesos requieren múltiples grupos. También puede comenzar a grabar inmediatamente después de enviar el comando buffer / list en ambos.
La lista de comandos DX12 se crea en un estado abierto. Esto me resulta un poco molesto ya que estoy acostumbrado a Vulkan. DX12 también requiere un reinicio explícito del asignador de comandos y la lista de comandos. Este es un comportamiento opcional en Vulkan.
Descriptores
** RootParameter : no es un equivalente exacto de VkDescriptorSetLayoutBinding pero un pensamiento similar en la imagen más grande.
VkDescriptorPool y ID3D12DescriptorHeaps son algo similares (gracias Nicolas) en que ambos manejan la asignación de los descriptores ellos mismos.
Cabe señalar que DX12 solo admite como máximo dos montones de descriptores vinculados a una lista de comandos en un momento dado. Un CBVSRVUAV y una muestra. Puede tener tantas tablas de descriptores como desee haciendo referencia a estos montones.
En el lado de Vulkan, hay un límite estricto para el número máximo de conjuntos de descriptores que le dice al grupo de descriptores. En ambos, debe realizar un poco de contabilidad manual sobre el número de descriptores por tipo que puede tener el grupo / montón. Vulkan también es más explícito con el tipo de descriptores. Mientras que en DX12 los descriptores son CBVSRVUAV o muestreador.
DX12 también tiene una función en la que puede vincular un CBV sobre la marcha utilizando SetGraphicsRootConstantBufferView. Sin embargo, la versión SRV de esto, SetGraphicsRootShaderResourceView, no funciona en texturas. Está en los documentos, pero también puede tomarle un par de horas para resolver esto si no es un lector cuidadoso.
Tubería
* ** RootSignature : no es un equivalente exacto de VkPipelineLayout .
DX12 combina el atributo de vértice y el enlace en una sola descripción.
Imágenes y Buffers
Las barreras en ambas API se descomponen un poco diferentes, pero tienen un resultado neto similar.
RenderPasses / RenderTargets
Los pases de render Vulkan tienen una buena característica de resolución automática. DX12 no tiene este AFIAK. Ambas API proporcionan funciones para la resolución manual.
No hay una equivalencia directa entre VkFramebuffer y ningún objeto en DX12. Una colección de ID3D12Resource que se asigna a los RTV es una similitud suelta.
VkFramebuffer actúa más o menos como un grupo de archivos adjuntos a los que VkRenderPass hace referencia mediante un índice. Los subpasos dentro de un VkRenderPass pueden hacer referencia a cualquiera de los archivos adjuntos en un VkFramebuffer, suponiendo que el mismo archivo adjunto no esté referenciado más de una vez por subpaso. El número máximo de archivos adjuntos de color utilizados a la vez está limitado a VkPhysicalDeviceLimits.maxColorAttachments.
Los objetivos de representación de DX12 son solo RTV respaldados por objetos ID3D12Resource. El número máximo de archivos adjuntos de color utilizados a la vez está limitado a D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8).
Ambas API requieren que especifique los objetivos / pasos de representación en la creación de los objetos de canalización. Sin embargo, Vulkan le permite usar pases de renderizado compatibles, por lo que no está bloqueado en los que especifique durante la creación de la tubería. No lo he probado en DX12, pero supongo que ya que es solo un RTV, esto también es cierto en DX12.
fuente
VkDescriptorPool
yID3D12DescriptorHeap
son similares en función (en la forma en que se asignan los descriptores), pero de forma bastante diferente, debido a las diferencias en la forma general en que los descriptores se manejan entre las API. Además, me imagino que el equivalente a D3D12VkBufferView
es buffers tipeados, al igual que para D3D11.