Как работает glTexImage2DMultisample?

Я хочу использовать мультисэмплированные текстуры.

Каким будет фрагментный шейдер и как передать несколько сэмплеров в шейдер?

Кроме того, какой API можно использовать для загрузки данных texel?

Я хочу использовать FBO по умолчанию для этого.

1 ответ

Решение

Ваша тема по-прежнему довольно обширна, и здесь было бы сложно дать глубокий ответ. На самом деле вы задаете здесь 3 не столь тривиальных вопроса, по которым вам следует читать сопутствующую литературу. В то время как вам лучше начать отсюда и, вероятно, приобрести эта книга тоже. Мои ответы предполагают, что вы используете современный (программируемый) OpenGL:

я хочу использовать мультисэмплированные текстуры.

Предполагая, что он вам нужен, когда вы используете свой собственный буфер кадров для использования стандартных буферов, вам не нужно мультисэмплирование, потому что это делается автоматически. Все, что вам нужно, это определить количество семплов при создании контекста OpenGL (например, с GLFW lib). Поэтому, если у вас есть пользовательский объект кадрового буфера (FBO) и вы хотите сделать мультисэмплинг текстуры, чтобы избавиться от связанных краев, вы должны создать мультисэмплированный объект текстуры:

glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, GL_TRUE);

Присоедините его к FBO. Затем фактический процесс рендеринга работает так:

Вы связываете свой FBO с помощью MS-текстурного вложения. Рендеринг вашей геометрии. Затем вы РАЗРЕШАЕТЕ мультисэмплированную текстуру или в обычную текстуру или прямо в задний буфер по умолчанию, перетаскивая:

glBlitFramebuffer(
    0, 0, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, 
    0, 0, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, 
    GL_COLOR_BUFFER_BIT, GL_NEAREST);

Общая процедура рендеринга должна быть такой:

void display()
{
glProgramUniform1i(ProgramName, UniformDiffuse, 0);

// Clear the framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f, 0.5f, 0.0f, 1.0f)[0]);

glUseProgram(ProgramName);

// Pass 1
// Render the scene in a multisampled framebuffer
glEnable(GL_MULTISAMPLE);
renderFBO(ProgramName, FramebufferRenderName);
glDisable(GL_MULTISAMPLE);

// Resolved multisampling
glBindFramebuffer(GL_READ_FRAMEBUFFER, FramebufferRenderName);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBlitFramebuffer(
    0, 0, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, 
    0, 0, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y, 
    GL_COLOR_BUFFER_BIT, GL_NEAREST);





swapBuffers();
}

Кстати, эти фрагменты кода взяты с этого замечательного сайта, где вы можете найти пример кода OpenGL, демонстрирующий решение многих общих проблем (включая вашу).

Каким будет фрагментный шейдер и как передать несколько сэмплеров в шейдер?

Загрузите примеры с вышеупомянутого сайта и взгляните на ogl-330-fbo-multisample.cpp и прилагаемый фрагментный шейдер.

Кроме того, какой API можно использовать для загрузки данных texel? Какие API будут использоваться для применения этой текстуры?

Вы можете использовать GLFW для простой загрузки TGA-текстур. А если вы хотите загрузить практически любой возможный формат изображения, взгляните на DevIL

Другие вопросы по тегам