Domanda

Multicampionamento è un modo di candidarsi antialiasing a schermo intero (FSAA) nelle applicazioni 3D.Devo utilizzare il multicampionamento nel mio programma OpenGL, che attualmente è incorporato in un file wxWidgets GUI.C'è un modo per fare questo?Si prega di rispondere solo se si conoscono i passaggi dettagliati per raggiungere questo obiettivo.

Sono a conoscenza dell'attivazione del multicampionamento utilizzando WGL (Estensioni Win32 a OpenGL).Tuttavia, poiché il mio programma OpenGL non è scritto in MFC (e desidero che il codice sia portatile multipiattaforma), questa non è un'opzione per me.

È stato utile?

Soluzione

Finalmente sono riuscito a far funzionare il multicampionamento con il mio programma OpenGL wxWidgets.È un po' complicato in questo momento, ma ecco come fare:

wxWidgets non ha Multicampionamento supporto nel loro versioni stabili adesso (l'ultima versione in questo momento è 2.8.8).Ma è disponibile come patch e anche tramite la loro istantanea quotidiana.(Quest'ultimo è incoraggiante, poiché significa che la patch è stata accettata e dovrebbe apparire nelle versioni stabili successive se non ci sono problemi.)

Quindi, ci sono 2 opzioni:

  1. Scarica e crea dal loro istantanea quotidiana.

  2. Ottenere il toppa per la tua installazione funzionante di wxWidgets.

Ho trovato la seconda opzione meno complicata, poiché non voglio disturbare il più possibile la mia installazione funzionante.Se non sai come applicare una patch su Windows, vedi Questo.

Come minimo, per Windows, la patch modificherà i seguenti file:

$(WX_WIDGETS_ROOT)/include/wx/glcanvas.h
$(WX_WIDGETS_ROOT)/include/wx/msw/glcanvas.h
$(WX_WIDGETS_ROOT)/src/msw/glcanvas.cpp

Dopo aver patchato, ricompilare le librerie wxWidgets.

Per abilitare il multicampionamento nel tuo programma OpenGL wxWidgets, sono necessarie piccole modifiche al codice.

È necessario passare un elenco di attributi al file wxGLCanvas costruttore:

int attribList[] = {WX_GL_RGBA,
                    WX_GL_DOUBLEBUFFER,
                    WX_GL_SAMPLE_BUFFERS, GL_TRUE, // Multi-sampling
                    WX_GL_DEPTH_SIZE, 16,
                    0, 0};

Se stavi già utilizzando un elenco di attributi, aggiungi la riga con GL_SAMPLE_BUFFERS, GL_TRUE ad esso.Altrimenti, aggiungi questa definizione dell'elenco di attributi al tuo codice.

Quindi modifica il tuo costruttore wxGLCanvas per prendere questo elenco di attributi come parametro:

myGLFrame::myGLFrame    // Derived from wxGLCanvas
(
    wxWindow *parent,
    wxWindowID id,
    const wxPoint& pos,
    const wxSize& size,
    long style,
    const wxString& name
)
: wxGLCanvas(parent, (wxGLCanvas*) NULL, id, pos, size, style, name, attribList)
{
    // ...
}

Dopo che l'elemento wxGLCanvas è stato creato, il multicampionamento è attivato per impostazione predefinita.Per disabilitarlo o abilitarlo a piacimento utilizzare le relative chiamate OpenGL:

glEnable(GL_MULTISAMPLE);
glDisable(GL_MULTISAMPLE);

Il multicampionamento ora dovrebbe funzionare con il programma wxWidgets OpenGL.Se tutto va bene, dovrebbe essere presto supportato nella versione stabile di wxWidgets, rendendo queste informazioni irrilevanti :-)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top