Как создать FBO с трафаретным буфером в OpenGL ES 2.0? - PullRequest
9 голосов
/ 12 апреля 2010

Мне нужен трафаретный буфер на 3GS для рендеринга плоской тени и полигона Смещение не будет работать префектом, все еще есть проблема с z-боем. Поэтому я использую буфер трафарета, чтобы сделать тень правильной, она работает на win32 gles2 эмулятор, но не на iPhone. После того, как я добавил пост-эффект ко всему сцена. Трафаретный буфер не будет работать даже на эмуляторе win32 gles2.

И я попытался прикрепить буфер трафарета к FBO, но экран превращается в черный. Вот мой код,

   glGenRenderbuffers(1, &dbo); // depth buffer
   glBindRenderbuffer(GL_RENDERBUFFER, dbo);
   glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES,
widthGL, heightGL);

   glGenRenderbuffers(1, &sbo); // stencil buffer
   glBindRenderbuffer(GL_RENDERBUFFER, sbo);
   glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, widthGL,
heightGL);

   glGenFramebuffers(1, &fbo);
   glBindFramebuffer(GL_FRAMEBUFFER, fbo);

   glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, tex, 0);
   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER, dbo);
   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, sbo); // this make the whole screen black.

eglContext создается с STENCIL_SIZE = 8, он работает без RTT.

Я попытался изменить RenderbufferStorage для буфера глубины и буфер трафарета, но ни один из них не работает.

Я что-то пропустил? Содержит ли буфер трафарета буфер глубины? (Я не могу найти такие вещи, как GL_DEPTH24_STENCIL8 ...)

Ответы [ 2 ]

14 голосов
/ 30 июня 2012

В OpenGL ES 2.0 на iOS вы должны создать комбинированный буфер рендеринга глубины и трафарета с помощью GL_DEPTH24_STENCIL8_OES, а затем присоединить его к связанному кадровому буферу как GL_DEPTH_ATTACHMENT и GL_STENCIL_ATTACHMENT.

glGenRenderbuffers(1, &depthStencilRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthStencilRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthStencilRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthStencilRenderbuffer);
3 голосов
/ 30 ноября 2016

Просто заметка, если вы используете GLKView, это так же просто, как

view.drawableStencilFormat = GLKViewDrawableStencilFormat8;

где вид: GLKView*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...