Convertire un semplice renderer OpenGL ES 2.0 in Direct3D 11

Per il primo esercizio di conversione, si inizierà con le nozioni di base: convertire un semplice renderer per un cubo basato su vertex-shader rotante da OpenGL ES 2.0 a Direct3D, in modo che corrisponda al modello di app DirectX 11 (Universal Windows) da Visual Studio 2015. Durante l'esecuzione di questo processo di porta, si apprenderà quanto segue:

  • Come convertire un semplice set di vertex buffer in buffer di input Direct3D
  • Come convertire uniformi e attributi in buffer costanti
  • Come configurare oggetti shader Direct3D
  • Come viene usata la semantica HLSL di base nello sviluppo di shader Direct3D
  • Come convertire GLSL in HLSL molto semplice

Questo argomento inizia dopo aver creato un nuovo progetto DirectX 11. Per informazioni su come creare un nuovo progetto DirectX 11, vedere Creare un nuovo progetto DirectX 11 per piattaforma UWP (Universal Windows Platform) (UWP).

Il progetto creato da uno di questi collegamenti include tutto il codice per l'infrastruttura Direct3D preparata ed è possibile iniziare immediatamente il processo di conversione del renderer da Open GL ES 2.0 a Direct3D 11.

Questo argomento illustra due percorsi di codice che eseguono la stessa attività grafica di base: visualizzare un cubo basato su vertex shader rotante in una finestra. In entrambi i casi, il codice riguarda il processo seguente:

  1. Creazione di una mesh di cubi da dati hardcoded. Questa mesh è rappresentata come un elenco di vertici, con ogni vertice che possiede una posizione, un vettore normale e un vettore di colore. Questa mesh viene inserita in un buffer dei vertici per l'elaborazione della pipeline di ombreggiatura.
  2. Creazione di oggetti shader per elaborare la mesh del cubo. Esistono due shader: un vertex shader che elabora i vertici per la rasterizzazione e uno shader di frammento (pixel) che colora i singoli pixel del cubo dopo la rasterizzazione. Questi pixel vengono scritti in una destinazione di rendering per la visualizzazione.
  3. Formando il linguaggio di ombreggiatura usato rispettivamente per l'elaborazione dei vertici e dei pixel nei vertex shader e nei fragment shader.
  4. Visualizzazione del cubo di cui è stato eseguito il rendering sullo schermo.

simple opengl cube

Al termine di questa procedura dettagliata, si avrà acquisito familiarità con le seguenti differenze di base tra Open GL ES 2.0 e Direct3D 11:

  • Rappresentazione dei vertex buffer e dei dati dei vertici.
  • Processo di creazione e configurazione degli shader.
  • Linguaggi di ombreggiatura e input e output per gli oggetti shader.
  • Comportamenti di disegno dello schermo.

In questa procedura dettagliata si fa riferimento a una struttura di renderer OpenGL semplice e generica, definita come segue:

typedef struct 
{
    GLfloat pos[3];        
    GLfloat rgba[4];
} Vertex;

typedef struct
{
  // Integer handle to the shader program object.
  GLuint programObject;

  // The vertex and index buffers
  GLuint vertexBuffer;
  GLuint indexBuffer;

  // Handle to the location of model-view-projection matrix uniform
  GLint  mvpLoc; 
   
  // Vertex and index data
  Vertex  *vertices;
  GLuint   *vertexIndices;
  int       numIndices;

  // Rotation angle used for animation
  GLfloat   angle;

  GLfloat  mvpMatrix[4][4]; // the model-view-projection matrix itself
} Renderer;

Questa struttura ha un'istanza e contiene tutti i componenti necessari per il rendering di una mesh vertex shaded molto semplice.

Nota Qualsiasi codice OpenGL ES 2.0 in questo argomento si basa sull'implementazione dell'API Windows fornita dal gruppo Khronos e usa la sintassi di programmazione di Windows C.

 

Informazioni importanti

Tecnologie

Prerequisiti

Passaggi

Argomento Descrizione

Convertire gli oggetti shader

Quando si esegue la conversione del renderer semplice da OpenGL ES 2.0, il primo passaggio consiste nel configurare gli oggetti vertex e fragment shader equivalenti in Direct3D 11 e per assicurarsi che il programma principale possa comunicare con gli oggetti shader dopo la compilazione.

Convertire i vertex buffer e i dati

In questo passaggio verranno definiti i vertex buffer che conterranno le mesh e i buffer di indice che consentono agli shader di attraversare i vertici in un ordine specificato.

Convertire il codice GLSL

Dopo aver spostato il codice che crea e configura i buffer e gli oggetti shader, è il momento di convertire il codice all'interno di tali shader dal linguaggio GL Shader (GLSL) di OpenGL ES 2.0 a Direct3D 11 High Level Shader Language (HLSL).

Disegnare sullo schermo

È arrivato il momento di portare il codice che disegna il cubo rotante sullo schermo.

 

Risorse aggiuntive