Representación de PRT con texturas (Direct3D 9)
El ejemplo PRTDemo y el simulador PRTCmdLine incluidos en el SDK de DirectX representan vectores de transferencia en los vértices de una malla. Para representar la señal PRT con precisión, esto puede requerir teselaciones que pueden ser poco prácticas para los juegos actuales. La representación de vectores de transferencia en mapas de texturas es un enfoque alternativo que tiene el mismo costo de datos independientemente de la complejidad de la malla. Hay varias maneras de generar mapas de textura de vectores de transferencia mediante la biblioteca PRT D3DX.
Precomputing Transfer Vectors
Un enfoque sería modificar los ejemplos PRTDemo y PRTCmdLine para calcular un vector de transferencia en cada elemento de textura en una parametrización de una superficie. Para ello, siga estos pasos:
- Modifique la llamada a D3DXCreatePRTEngine para extraer las coordenadas de textura de la malla (ExtractUVs debe ser TRUE)
- Reemplace las llamadas D3DXCreatePRTBuffer por D3DXCreatePRTBufferTex con el mismo tamaño de textura.
Todos los métodos ID3DXPRTEngine funcionan con simulaciones por elemento de textura, excepto ComputeBounceAdaptive, ComputeSSAdaptive, ComputeSS y ComputeDirectLightingSHAdaptive. Aunque la simulación de espacio de textura generará el resultado correcto, a menudo puede ser bastante lenta, ya que probablemente será calcular vectores de transferencia a una alta densidad.
Otro enfoque consiste en calcular una simulación PRT adaptable por vértice (con coordenadas de textura que se usarán para los datos por elemento de textura) y, a continuación, llamar a ID3DXPRTEngine::ResampleBuffer (mediante un búfer de salida creado mediante D3DXCreatePRTBufferTex en la resolución adecuada). Esto funciona con toda la funcionalidad PRT de D3DX en el SDK y a menudo puede ser mucho más eficaz que calcular directamente un búfer de transferencia por elemento de textura.
Cálculos en tiempo de ejecución
Si se usa un único clúster, los resultados se pueden filtrar y asignar mip como cualquier otra textura y el sombreador de píxeles es idéntico al código del sombreador de vértices que se incluye con PRTDemo.
Si la compresión genera varios clústeres, no puede filtrar ni asignar los datos porque los índices de agrupación en clústeres no son continuos. Estas son algunas alternativas para controlar los datos de varios clústeres:
- Realice todo el filtrado usted mismo en el sombreador de píxeles. Desafortunadamente, esto suele ser poco práctico por motivos de rendimiento.
- Si las texturas son texturas no asignadas a mip (es decir, mapas de luz), es más probable que sea más eficaz calcular la iluminación directamente en el espacio de textura, donde no se producirá ningún filtrado y representar el objeto con una textura sombreada. Básicamente, se trata de un mapa de luz dinámico que se crea completamente en la GPU.
- Si se usa un atlas de textura (consulte Uso de UVAtlas (Direct3D 9)), puede agrupar manualmente la escena haciendo que todos los vectores de transferencia de un componente conectado en el espacio de textura estén en el mismo clúster. De este modo, puede filtrar la textura porque todos los elementos de textura a los que se accede estarían en el mismo clúster mediante la construcción. El identificador de clúster de una cara determinada se puede propagar desde el sombreador de vértices.
Los sombreadores de píxeles tienen mucho menos registros constantes que no se pueden indizar, por lo que el sombreador de píxeles es algo diferente que el sombreador de vértices. El almacenamiento del trabajo por clúster en una textura dinámica de baja resolución y el uso de cargas de textura sería la manera más eficaz de representar al usar varios clústeres.
Temas relacionados