es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Actualización parcial del búfer constante de D3D11

En mi tiempo libre, estoy trabajando en un motor 3D utilizando D3D11. Para lograr el efecto 3D, utilizo la multiplicación de la matriz de vista de modelo típica en mis sombreadores HLSL. Estas matrices se cargan en un búfer constante d3d11. La matriz de proyección solo cambia cuando se redimensiona el área de visualización, pero la matriz de modelo y vista pueden cambiar en cada cuadro (cuando el modelo o la cámara se mueven). Estos cambios en las matrices deben cargarse en el mismo búfer constante para poder utilizarse en los sombreadores. Al cargar estos cambios, la matriz de proyección (generalmente) no cambia, por lo que no quiero volver a cargar esta matriz. En resumen, necesito actualizar parcialmente mi búfer constante actualizando solo partes específicas (desplazamientos) en mi búfer.

En OpenGL, tenemos búferes uniformes y funcionan (creo) de la misma manera que un búfer constante d3d11. Sin embargo, si deseas actualizar una parte específica del búfer uniforme, puedes utilizar la función de OpenGL glBufferSubData. Intenté buscar una forma similar de hacer esto en D3D11, pero no encontré nada. Encontré a alguien con un problema similar, pero estaba utilizando D3D11.1.
Enlace a la publicación original: https://stackoverflow.com/questions/47007141/how-to-partially-update-constant-buffer-in-directx-11-1. Alguien también mencionó que en D3D11, necesitas cargar todos los datos en el búfer constante si deseas cambiar una parte específica. Pero esto podría resultar en mantener una copia completa de mi búfer en el lado de la CPU (RAM). Debe haber una mejor manera, ¿verdad?

TL;DR: ¿Cómo puedo actualizar mi búfer constante d3d11 en un desplazamiento específico?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, en DirectX 11 no hay un equivalente directo a la función glBufferSubData de OpenGL para actualizar parcialmente un búfer constante. Como se mencionó, algunas fuentes sugieren que debes volver a subir todo el búfer aunque solo una pequeña parte haya cambiado. Sin embargo, esto puede ser ineficiente y causar una sobrecarga innecesaria en la CPU.

    Una posible solución alternativa es utilizar múltiples búferes constantes, cada uno almacenando una parte de los datos que necesitas actualizar. Luego, durante el proceso de renderizado, puedes enlazar el/los búferes constantes relevantes según las partes de los datos que hayan cambiado. Esto puede reducir la cantidad de datos que necesitas subir por cuadro, pero puede aumentar la cantidad de llamadas de dibujo necesarias.

    Otra opción es utilizar recursos dinámicos, como texturas o búferes de vértices dinámicos, que permiten actualizaciones parciales. Podrías utilizar un recurso dinámico para almacenar los datos que necesitan actualizarse con frecuencia, y luego utilizar un búfer constante para almacenar los datos que permanecen constantes (como la matriz de proyección).

    En general, no existe una solución fácil o ideal para actualizar parcialmente un búfer constante en DirectX 11. Puede requerir cierta experimentación y compensaciones entre el rendimiento y el uso de memoria.

Comments are closed.