Почему не работает мультисэмплинг? - PullRequest
1 голос
/ 29 февраля 2012

Я пытаюсь заставить работать мультисэмплинг в моем приложении OpenGL ES.

Код установки кадрового буфера:

glGenFramebuffersOES(1, &framebuffer);
glGenRenderbuffersOES(1, &colorRenderbuffer);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);  
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id<EAGLDrawable>)self.layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);

GLint backingWidth;
GLint backingHeight;
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

glGenFramebuffersOES(1, &sampleFramebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, sampleFramebuffer);

glGenRenderbuffersOES(1, &sampleColorRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, sampleColorRenderbuffer);
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_RGBA8_OES, backingWidth, backingWidth);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, sampleColorRenderbuffer);

glGenRenderbuffersOES(1, &sampleDepthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, sampleDepthRenderbuffer);
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_DEPTH_COMPONENT16_OES, backingWidth, backingWidth);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, sampleDepthRenderbuffer);

Код перевода:

glBindFramebufferOES(GL_RENDERBUFFER_OES, sampleFramebuffer);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

GLfloat vertices[] = {
    1.0f, 1.0f, 0.0f,
    2.0f, 4.0f, 0.0f,
    1.0f, 3.0f, 0.0f
};
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);

glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, sampleFramebuffer);
glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, framebuffer);
glResolveMultisampleFramebufferAPPLE();

glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

Результат:

Rendering result

Как видите, треугольник все еще имеет псевдонимы сторон.

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012

sampleFramebuffer - это кадровый буфер, а не рендер-буфер. Но вы связываете это как renderbuffer при рендеринге кода. Это неверно. Вы должны проверить ошибки OpenGL, вызвав glGetError - это скажет вам, какой вызов GL является недействительным.

Ваш код рендеринга должен начинаться со следующей строки:

glBindFramebufferOES(GL_FRAMEBUFFER_OES, sampleFramebuffer);

Остальное в порядке. Но для повышения производительности вы можете использовать вызов glDiscardFramebufferEXT на вашем мультисэмпловом кадровом буфере после вызова Resolve:

glResolveMultisampleFramebufferAPPLE();
const GLenum discards[]  = {GL_COLOR_ATTACHMENT0,GL_DEPTH_ATTACHMENT};
glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE,2,discards);
0 голосов
/ 31 октября 2015

Мультисэмплирование Apple не полностью избавляется от наложенных краев, особенно при углах около 0, 90, 180 и 270. Но это должно помочь смягчить их.

В некоторых из моих тестов я обнаружил лишь небольшую разницу при включении и выключении. И вы должны решить, стоит ли это затрат в вашем приложении. Например, на iPhone плотность пикселей настолько мала, что это не имеет значения для моего глаза. Однако в tvOS псевдонимы довольно заметны, как на 45-дюймовом экране.

...