2010-12-07 12 views
6

Me preguntaba si hay soporte en los modelos de sombreador más nuevos para leer un valor de píxel del framebuffer de destino. Supongo que esto también se hace en etapas posteriores (no programables) en el proceso de diseño, lo que me hizo esperar que esta característica se haya agregado a la canalización programable.Shader framebuffer readback

Soy consciente de que es posible dibujar en un framebuffer vinculado a la textura y luego enviar esta textura al shader, solo esperaba una forma más elegante de lograr la misma funcionalidad.

Respuesta

4

Como Andrew señala, el acceso uso de este dispositivo es lógicamente una etapa separada del fragment shader, por lo que la lectura del uso de este dispositivo en el fragment shader es imposible. La razón de esto (para responder la pregunta de Andrew) es una combinación de rendimiento y los requisitos de pedido de la canalización de gráficos. La forma en que se define la canalización de renderizado, las operaciones de mezcla de framebuffer DEBEN ocurrir en el mismo orden que los triángulos/primitivos que entraron al principio de la canalización. Los sombreadores de fragmentos, por otro lado, pueden suceder en cualquier orden. Por lo tanto, al hacer que sean etapas separadas, la GPU puede ejecutar sombreadores de fragmentos lo más rápido que pueda, a medida que sus entradas estén disponibles, sin tener que sincronizar entre ellos. Siempre que mantenga suficiente espacio de bufffer para aferrarse a las salidas de los sombreadores de fragmentos, de modo que puedan acumularse y permitir que las mezclas de framebuffer y escrituras ocurran en orden, todo está bien, ya que los resultados de cualquier sombreador de fragmentos dado son no visible hasta después de la etapa de fusión.

Si hay una forma de que el sombreador de fragmentos lea el framebuffer, se requerirá algún tipo de sincronización para garantizar que esas lecturas suceden en orden, lo que ralentiza considerablemente las cosas.

3

No. Como mencionas, renderizar en una textura es la forma de lograr esa funcionalidad.

Si observa un diagrama de bloques de una tubería de GPU, verá que la etapa de fusión, que es la que combina la salida del sombreador de fragmentos con el framebuffer, está separada del sombreador de fragmentos y es de función fija.

No soy diseñador de GPU, así que solo puedo especular sobre el motivo. Presumiblemente, es para mantener el acceso al framebuffer rápido y aislar la etapa de fragmentación de fragmentos del buffer del cuadro para que pueda ser mejor paralelizado. Probablemente también haya problemas con respecto al muestreo múltiple, y así sucesivamente.

(por no mencionar que de función fija de mezcla es "suficientemente bueno" en la mayoría de los casos.)

1

En realidad, creo que esto ahora es factible con Direct3D 11 SM 5.0 (aunque no lo probé).

Puede vincular un UAV a una PS 5.0, para permitir operaciones de lectura y escritura con el método OMSetRenderTargetsAndUnorderedAccessViews.

En ese caso, el backbuffer de la cadena de intercambio en el que renderiza tiene que crearse con el indicador DXGI_USAGE_UNORDERED_ACCESS (supongo).

Esto se utiliza en la muestra DXSDK OIT11.

0

Puede dibujar en un TEX de textura (usando una vista de destino de renderizado) y luego vincular eso como una entrada a otro sombreador (utilizando una vista de recursos de sombreado). TEX es entonces un buffer pseduo-frame.

1

Es posible volver a leer el contenido del búfer de cuadros en el sombreador de fragmentos con la extensión Shader_framebuffer_fetch. El soporte se puede agregar a la GPU con alguna pérdida de rendimiento. De hecho, en estos días estoy trabajando para agregar el soporte de esta extensión en el controlador OpenGL ES2.0 de una conocida marca de GPU en el mercado de electrónica de consumo.