Jak używać Multisamplingu z OpenGL FBO

Próbuję włączyć mutlisampling I Alpha-to-coverage dla FBO. Używając domyślnego bufora ramek, wystarczy wywołać glEnable(GL_MULTISAMPLE) i glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE). Jednak nie jestem w stanie osiągnąć tego samego efektu przy użyciu własnego FBO.

Mój cel: narysuj scenę do FBO w ten sam sposób, w jaki zostanie narysowana do domyślnego bufora ramek z powyższymi właściwościami. Stamtąd chcę być w stanie używać obrazu jako tekstury dla przyszłych przejść przez shader.

To działa : kod dla tworzenie FBO bez multisamplingu / alpha-to-coverage, 1 Color attachment, 1 depth attachment:

// Generate the color attachment
glGenTextures(1,&defaultColorAttachment0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,defaultColorAttachment0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,screenWidth,screenHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);

// Bind the texture to the FBO
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, defaultColorAttachment0,0);

// Generate the depth attachment
glGenRenderbuffers(1,&defaultDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, defaultDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, screenWidth, screenHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, defaultDepthBuffer);

To nie działa . Kod próbkujący zrobić multisampled FBO:

// Generate the color attachment
glGenTextures(1,&defaultColorAttachment0);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, defaultColorAttachment0);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA, screenWidth, screenHeight, GL_FALSE);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, defaultColorAttachment0,0);

// Generate the depth attachment
glGenRenderbuffers(1,&defaultDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, defaultDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, screenWidth, screenHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, defaultDepthBuffer);

Próbowałem przejrzeć OpenGL wiki na ten temat, chociaż jest niekompletny (różne niedokończone nagłówki sprawiają, że wygląda nieprofesjonalnie). Nigdy nie narzeka. Próbowałem się z tym bawić, ale albo dostaję czarny ekran, albo ekran pełen śmieciowych pikseli.

Główna Pytanie: jakie rzeczy muszę wziąć pod uwagę/zmienić i gdzie (tworzenie FBO, tekstury, shadery), aby uzyskać multisampling I Alpha-to-coverage do pracy z FBO?

Author: genpfault, 2013-12-10

1 answers

Aby to działało poprawnie, musisz przydzielić wieloczłonowy bufor głębi i nadać mu taką samą liczbę próbek jak bufor kolorów. Innymi słowy, powinieneś zadzwonić glRenderbufferStorageMultisample (...) zamiast glRenderbufferStorage (...).

Twój FBO powinien nie sprawdzać kompletności, w jaki sposób jest teraz alokowany. Wezwanie do glCheckFramebufferStatus (...) powinien zwrócić GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE ponieważ twój bufor głębi ma dokładnie 1 próbka i twój załącznik bufora kolorów ma 4.


Ponieważ w tym FBO używasz również wielowarstwowego załącznika tekstur, powinieneś być świadomy różnic między próbkowaniem tekstur pojedynczo próbkowanych a wielowarstwowymi w shaderach GLSL.

Tekstury Multisamplowane mają specjalny typ samplera ( np. sampler2DMS) i musisz jawnie pobrać każdą próbkę w teksturze przez jej liczbę całkowitą (niezormalizowaną) współrzędną tekstową i indeks próbki za pomocą texelFetch (...). Oznacza to również, że nie mogą być filtrowane lub mip-mapowane.

Prawdopodobnie nie chcesz w tym przypadku tekstury wielowarstwowej, prawdopodobnie chcesz użyć glBlitFramebuffer (...) aby zrobić rozwiązanie MSAA w pojedynczym próbkowaniu FBO. Jeśli to zrobisz, możesz odczytać wyniki wygładzania w shaderach, zamiast pobierać każdą próbkę i samodzielnie wdrażać wygładzanie.

 23
Author: Andon M. Coleman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-19 16:22:50