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?
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.
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