2013-11-25 17 views
7

Ho reimplementato OpenCSG per la versione moderna OpenGL.Problema di anti-aliasing con MSAA, disegno CSG con profondità e FBO

PixelFormatAttributes:

NSOpenGLPFAColorSize , 24 , 
NSOpenGLPFAAlphaSize , 8 , 
NSOpenGLPFADepthSize , 32 , 
NSOpenGLPFAStencilSize , 8 , 
NSOpenGLPFAAccelerated , 
NSOpenGLPFADoubleBuffer , 
NSOpenGLPFASupersample , 
NSOpenGLPFASampleBuffers, 1 , 
NSOpenGLPFASamples  , 4 , 

FBO specifiche: (provato rendere a FBO con multisample, ma le linee ottenere più forte e visibile, sguardo sul screenshot in basso)
- texture creata con potenza di 2, GL_RGBA (GL_RGBA8 provato e GL_RGBA32F)
- GL_DEPTH24_STENCIL8 (provato GL_DEPTH32_STENCIL8, nessun risultato)


Goldfeather Semplicemente algoritmo:

while (i < depth complexity) { 
    take channel for render 
     merge layers if no free channel 
    render each layer with stencil func, mask and depth params to channel (FBO) 
} 
merge layers (taking texture from FBO and render objects again with applying shader below) 


In Shader Ho codice per la fusione (risultato texture da FBO si sovrappone sulla parte superiore di rendere per i test, in OpenCSG it's setupProjectiveTexture):

 vec2 ndcPos = gl_FragCoord.xy/sizetexture.xy; 
    vec4 maskColor = texture2D(maskTexture, ndcPos.xy); 
    if (maskColor[channel] < 0.5) { 
     discard; 
    } 

enter image description here

Sembra che dopo l'FBO non si ottenga una texture abbastanza chiara o una dimensione non corretta.

EDIT:
Quelle linee appare solo in sovrapposizione luoghi di sottrarre mesh.

EDIT 2:
fisso con il rendering non MSAA FBO e applicando FXAA sul risultato.

+0

Il buffer colore a 32 bit + alpha 8 bit mi sembra particolarmente insolito. Normalmente i formati dei pixel sono configurati come: 32 bit (8 bit inutilizzati) RGB + 0 A o 24 bit RGB + 8 bit A, quasi mai RGB a 32 bit + 8 bit A (che produce un colore a 40 bit buffer). Non dovrebbe fare la differenza poiché CGL corrisponderà al formato più vicino, ma tu stai chiedendo qualcosa di fondamentalmente strano. –

+0

@ AndonM.Coleman in realtà hai ragione, cambierà! Ma non ha risolto il mio problema. Ho trovato alcuni articoli su come risolvere un problema simile: 1. http://www.alphanew.net/index.php?section=articles&site=multisampling 2. http://mtnphil.wordpress.com/2013/06/ 26/know-your-ssao-artefacts/ Ma per me è difficile da capire a fondo, perché non sono madrelingua. Forse capirò più tardi. – SAKrisT

+0

A proposito, quando si specifica 'Supersample' nel formato pixel, si richiede GL per SSAA anziché MSAA. Questo è OS X; Non ho mai incontrato un formato pixel accelerato hardware su OS X che supporti il ​​supersampling, solo il renderer del software. Ti suggerirei di rimuoverlo anche dal tuo formato pixel. A questo punto questo sta diventando piuttosto pignolo, ma dal momento che l'unica informazione nella domanda in questo momento è legata al tuo formato pixel ... :) –

risposta

0

Non sono sicuro di aver capito bene le tue spiegazioni. Che tipo di texture stai campionando nello shader?

Non conosco le specifiche dell'algoritmo che si sta implementando ma se quella texture contiene i risultati di alcuni calcoli precedenti con la raccolta di più campioni già eseguita, non sono sicuro che sia possibile utilizzare tale risultato per un intero frammento (e tutti i suoi campioni). La maschera sta per sbiadire ai bordi, che sembra essere il problema qui.

Forse dovresti eseguire il campionamento "a mano", ad es. utilizzare un sampler2DMS e leggere singoli campioni con texelFetch nello shader.

Un'altra soluzione potrebbe essere quella di impostare gl_SampleMask su tutti i 1 del primo passaggio per impedire lo sbiadimento ai bordi.

Problemi correlati