Я пытаюсь рендерить envmap'у в разные мипы кубемапы.
const levels = 8; const width = 128; const height = 128; const internalFormat = gl.RGBA8; const type = gl.UNSIGNED_BYTE; const format = gl.RGBA; const bindingPoint = gl.TEXTURE_CUBE_MAP; const level = 1; const target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + 0; const magFilter = gl.LINEAR; const minFilter = gl.LINEAR_MIPMAP_LINEAR; const wrapS = gl.CLAMP_TO_EDGE; const wrapT = gl.CLAMP_TO_EDGE; const texId = gl.createTexture(); gl.bindTexture(bindingPoint, texId); gl.texParameteri(bindingPoint, gl.TEXTURE_WRAP_S, wrapS); gl.texParameteri(bindingPoint, gl.TEXTURE_WRAP_T, wrapT); gl.texParameteri(bindingPoint, gl.TEXTURE_MIN_FILTER, minFilter); gl.texParameteri(bindingPoint, gl.TEXTURE_MAG_FILTER, magFilter); gl.texStorage2D(bindingPoint, levels, internalFormat, width, height); const framebuffer = gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, target, texId, level); const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); console.assert(status === gl.FRAMEBUFFER_COMPLETE, 'incomplete!'); gl.viewport(0, 0, width/2, height/2); // cube rendering
После всего этого внутри шейдера получаю данные 'textureLod()'. В результате чёрные пиксели.
По спеке WebGL 2 должно работать, но не работает.
Проверено на Chromium 70.0.3538.110 version, on Firefox 63.0.3.
Кто знает, что не так?
На stackoverflow https://stackoverflow.com/questions/53501687/render-to-a-non-zero… of-a-cube-map
Не поможет поставить у текстуры GL_TEXTURE_MAX_LEVEL равный level-1 перед рендером в мип?
Алмаз
> const target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + 0;
это как бы в цикле ? у кубемапы, напоминаю, 6 граней
Алмаз
> gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, target, texId,
> level);
Там с этим level какие-то проблемы: в документации написано, что должен быть 0 https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glFr… Texture2D.xml . Я недавно много чего перепробовал, но подцепить рендер в мип>0 не получилось даже для простой GL_TEXTURE_2D. glTextureView доступно? Можно через него сделать.
innuendo
Естественно.
ncuxonaT
Нет, не помогло.
BingoBongo
Это WebGL 2.0. Должно работать по спеке.
Алмаз
Из твоей же спеки:
level
A GLint specifying the mipmap level of the texture image to be attached. Must be 0.
A gl.INVALID_VALUE error is thrown if level is not 0.
(https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingCo… fferTexture2D)
Алмаз
Память под мипы выделена? Если просто использовать glGenerateMipmap без самостоятельного рендера в мипы, всё равно чернота будет?
небось в самого себя как минимум нельзя рендить. плюс вон пишут в мипы нельзя
kas
лучше расскажи как круто не на PC
BingoBongo
По ссылке внизу страницы есть две ссылки на стандары OGL ES 2.0 и ES 3.0. Если в заглянуть в спеку второго стандарта, то таки да, level должен быть равен нулю. Но в спеке третьего стандарта, которая по сути есть WebGL 2.0, подобного ограничения на значение level нет.
kas
Это два разных колор атачмента, две разные кубемапы. Одну передаю как юниформу в шейдер, а в другую пишу.
ncuxonaT
Если залить в каждый фейс кубемапы в нулевые мипы и вызвать 'glGenerateMipmap()', то цвет выводится.
Алмаз
> Если залить в каждый фейс кубемапы в нулевые мипы и вызвать
> 'glGenerateMipmap()', то цвет выводится.
тогда что не так ?
innuendo
В мипы кубемапы шейдер рендерит envmap'у для разных значений roughness'а. Следовательно, 'glGenerateMipmap()' идёт лесом.
Алмазвообще кубемапу нельзя так просто размывать - швы полезут.
На обычной 2д текстуре алгоритм верно работает? Нулевой лод не черный?
По вашему коду не очень понятно, вы берете готовую кубемапу и рендерите в её же мипы, или создаёте новую? Если второе, то почему начинаете с 1 уровня, а не с 0?
Всем спасибо за помощь. В движке товарища Bave было некорректное кэширование колор атачментов. Теперь всё работает.
ncuxonaT
Рендерю в другую кубемапу. Нулевой уровень для матерьялов с уровнем roughness равный 0.
Алмаз
> некорректное кэширование колор атачментов.
всё зло от преждевременной оптимизации … и от загрузки за 1 вызов :)
Тема в архиве.