ПрограммированиеФорумГрафика

Render to a non-zero mip level of a cube map

#0
18:02, 27 ноя 2018

Я пытаюсь рендерить 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

#1
18:40, 27 ноя 2018

Не поможет поставить у текстуры GL_TEXTURE_MAX_LEVEL равный level-1 перед рендером в мип?

#2
18:49, 27 ноя 2018

Алмаз
> const target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + 0;

это как бы в цикле ? у кубемапы, напоминаю, 6 граней

#3
19:00, 27 ноя 2018

Алмаз
> 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 доступно? Можно через него сделать.

#4
19:07, 27 ноя 2018

innuendo
Естественно.

ncuxonaT
Нет, не помогло.

BingoBongo
Это WebGL 2.0. Должно работать по спеке.

#5
19:12, 27 ноя 2018

Алмаз
Из твоей же спеки:

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)

#6
19:37, 27 ноя 2018

Алмаз
Память под мипы выделена? Если просто использовать glGenerateMipmap без самостоятельного рендера в мипы, всё равно чернота будет?

#7
19:52, 27 ноя 2018

небось в самого себя как минимум нельзя рендить. плюс вон пишут в мипы нельзя

#8
20:08, 27 ноя 2018

kas

лучше расскажи как круто не на PC

#9
13:29, 28 ноя 2018

BingoBongo
По ссылке внизу страницы есть две ссылки на стандары OGL ES 2.0 и ES 3.0. Если в заглянуть в спеку второго стандарта, то таки да, level должен быть равен нулю. Но в спеке третьего стандарта, которая по сути есть WebGL 2.0, подобного ограничения на значение level нет.

kas
Это два разных колор атачмента, две разные кубемапы. Одну передаю как юниформу в шейдер, а в другую пишу.

ncuxonaT
Если залить в каждый фейс кубемапы в нулевые мипы и вызвать 'glGenerateMipmap()', то цвет выводится.

#10
15:34, 28 ноя 2018

Алмаз
> Если залить в каждый фейс кубемапы в нулевые мипы и вызвать
> 'glGenerateMipmap()', то цвет выводится.

тогда что  не так ?

#11
12:13, 29 ноя 2018

innuendo
В мипы кубемапы шейдер рендерит envmap'у для разных значений roughness'а. Следовательно, 'glGenerateMipmap()'  идёт лесом.

#12
14:31, 29 ноя 2018

Алмазвообще кубемапу нельзя так просто размывать - швы полезут.
На обычной 2д текстуре алгоритм верно работает? Нулевой лод не черный?
По вашему коду не очень понятно, вы берете готовую кубемапу и рендерите в её же мипы, или создаёте новую? Если второе, то почему начинаете с 1 уровня, а не с 0?

#13
17:45, 29 ноя 2018

Всем спасибо за помощь. В движке товарища Bave было некорректное кэширование колор атачментов. Теперь всё работает.


ncuxonaT
Рендерю в другую кубемапу. Нулевой уровень для матерьялов с уровнем roughness равный 0.

#14
17:46, 29 ноя 2018

Алмаз
> некорректное кэширование колор атачментов.

всё зло от преждевременной оптимизации …  и от загрузки за 1 вызов :)

ПрограммированиеФорумГрафика

Тема в архиве.