Относительно мультисэмплинга текстур
Я рендеринг белого куба с зеленым фоном в FBO не по умолчанию и присоединение созданной мультисэмплированной текстуры к этому FBO. Когда я отрисовываю куб в FBO по умолчанию, используя вышеупомянутую текстуру, это дает искажение в текстуре.
Вот мой код:
viewport_width=32;
viewport_height=32;
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureId);
nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glBindTexture(*target, textureId);"));
glUniform1i(glGetUniformLocation(shader_data.psId,"tk_diffuseMap"), 0);
nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glUniform1i(glGetUniformLocation(shader_data.psId,\"basetexture\"), 0);"));
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4 ,GL_RGBA, viewport_width, viewport_height ,true);
nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4 ,GL_RGBA, 32, 32,true);"));
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, Fboid);
nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glBindFramebuffer(GL_FRAMEBUFFER, Fboid);"));
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D_MULTISAMPLE,textureId,0);
nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D_MULTISAMPLE,textureId,0);"));
glEnable(GL_MULTISAMPLE);
nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glEnable(GL_MULTISAMPLE);"));
draw_cube(viewport_width, viewport_height);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glBindFramebuffer(GL_FRAMEBUFFER, Fboid);"));
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureId);
nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glBindTexture(*target, textureId);"));
glDrawElements ( GL_TRIANGLES, 36,GL_UNSIGNED_INT, indices );
фрагментный шейдер:
uniform sampler2DMS tk_diffuseMap;
in vec3 ps_texCoord;
out vec4 fragColor;
void main(void)
{
vec2 iTmp = textureSize(tk_diffuseMap);
vec2 tmp = iTmp * ps_texCoord.xy;
vec4 color;
for(int i = 0; i < 4; ++i)
{
color = color + texelFetch(tk_diffuseMap, ivec2(tmp), i);
}
fragColor=vec4(color/4);
}
Дайте мне знать, где я иду не так.
1 ответ
Текстура, используемая в качестве целевого приложения рендеринга FBO, не должна быть привязана как источник выборки, если FBO, к которому она прикреплена, также привязана как цель рендеринга. Это либо текстура, либо FBO.
Очевидно, почему так должно быть: если бы вы могли связать текстуру, которая также является целью рендеринга, вы бы создали циклический цикл зависимости.