Usando primitivos Higher-Order (Direct3D 9)
Esta seção mostra como usar primitivos de ordem superior em seu aplicativo.
- Determinando Higher-Order suporte primitivo
- Desenhando patches
- Gerando normais e coordenadas de textura
Determinando Higher-Order suporte primitivo
O membro DevCaps da estrutura D3DCAPS9 pode ser consultado para determinar o nível de suporte para operações que envolvem primitivos de ordem superior. A tabela a seguir lista os recursos do dispositivo relacionados a primitivos de ordem superior no Direct3D 9.
Funcionalidade do dispositivo | Descrição |
---|---|
D3DDEVCAPS_NPATCHES | O dispositivo dá suporte a N-patches e é baseado em triângulos PN curvo (um tipo especial de triângulos Bézier cúbicos). |
D3DDEVCAPS_QUINTICRTPATCHES | O dispositivo dá suporte a curvas de Bézier quintetos e splines B. |
D3DDEVCAPS_RTPATCHES | O dispositivo dá suporte a patches retangulares e triangulares (patches RT). |
D3DDEVCAPS_RTPATCHHANDLEZERO | Os patches RT podem ser desenhados com eficiência usando o identificador zero. |
Observe que D3DDEVCAPS_RTPATCHHANDLEZERO não significa que um patch com o identificador zero possa ser desenhado. Um patch de identificador zero sempre pode ser desenhado, independentemente de essa funcionalidade do dispositivo estar definida ou não. Quando essa funcionalidade é definida, a arquitetura de hardware não requer o cache de nenhuma informação e que os patches não armazenados em cache (identificador zero) sejam desenhados com a eficiência que os armazenados em cache.
Desenhando patches
O Direct3D 9 dá suporte a dois tipos de primitivos de ordem superior ou patches. Eles são chamados de patches N e Rect/Tri. Os n-patches podem ser renderizados usando qualquer chamada de renderização de triângulo habilitando N-patches por meio da chamada para IDirect3DDevice9::SetNPatchMode( nSegments ) com valor nSegments maior que 1,0. Os patches Rect/Tri devem ser renderizados usando os seguintes pontos de entrada explícitos.
Você pode usar os métodos a seguir para desenhar patches.
- IDirect3DDevice9::D rawRectPatch. Para entender melhor como os dados de patch são referenciados no buffer de vértice, consulte D3DRECTPATCH_INFO.
- IDirect3DDevice9::D rawTriPatch. Para entender melhor como os dados de patch são referenciados no buffer de vértice, confira D3DTRIPATCH_INFO.
IDirect3DDevice9::D rawRectPatch desenha um patch retangular de alta ordem especificado pelo parâmetro pRectPatchInfo usando os fluxos definidos no momento. O parâmetro Handle é usado para associar o patch a um identificador para que, na próxima vez que o patch for desenhado, não haja necessidade de especificar novamente pRectPatchInfo. Isso possibilita pré-compilar e armazenar em cache coeficientes de diferença de encaminhamento ou outras informações, o que, por sua vez, permite chamadas subsequentes para IDirect3DDevice9::D rawRectPatch usando o mesmo identificador para ser executado com eficiência.
Destina-se a que, para patches estáticos, um aplicativo defina o sombreador de vértice e os fluxos apropriados, forneça informações de patch no parâmetro pRectPatchInfo e especifique um identificador para que o Direct3D possa capturar e armazenar informações em cache. Em seguida, o aplicativo pode chamar IDirect3DDevice9::D rawRectPatch subsequentemente com pRectPatchInfo definido como NULL para desenhar o patch com eficiência. Ao desenhar um patch armazenado em cache, os fluxos definidos no momento são ignorados. No entanto, é possível substituir o pNumSegs armazenado em cache especificando novos valores para pNumSegs. Além disso, é necessário definir o mesmo sombreador de vértice ao renderizar um patch armazenado em cache como foi definido quando ele foi capturado.
Para patches dinâmicos, os dados de patch são alterados para cada renderização do patch, portanto, não é eficiente armazenar informações em cache. O aplicativo pode transmitir isso para o Direct3D definindo Handle como 0. Nesse caso, o Direct3D desenha o patch usando os fluxos definidos no momento e os valores de pNumSegs e não armazena em cache nenhuma informação. Não é válido definir simultaneamente Handle como 0 e pPatch como NULL.
Ao especificar novamente pRectPatchInfo para o mesmo identificador, o aplicativo pode substituir as informações armazenadas em cache anteriormente.
IDirect3DDevice9::D rawTriPatch é semelhante a IDirect3DDevice9::D rawRectPatch , exceto que desenha um patch triangular de alta ordem.
Gerando normais e coordenadas de textura
Se você estiver usando um sombreador FVF (formato de vértice flexível), a geração automática de normais e coordenadas de textura não será possível.
Para normais, você pode fornecê-los diretamente ou fazer com que o Direct3D os calcule para você.
As coordenadas geradas para patches retangulares são coordenadas baseadas em spline, conforme mostrado nas ilustrações a seguir.
As coordenadas geradas para patches triangulares são coordenadas baseadas em spline barycentric, conforme mostrado nas ilustrações a seguir.
Se um aplicativo precisar alterar o intervalo das coordenadas de textura geradas, isso poderá ser feito usando transformações de textura.
Tópicos relacionados