Буфер глубины FBO красный

Я не могу заставить свою теневую систему работать должным образом. Я использую следующий код для создания своего FBO:

int frameBuffer = GL30.glGenFramebuffers();
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer);
GL11.glDrawBuffer(GL11.GL_NONE);
GL11.glReadBuffer(GL11.GL_NONE);

int texture = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL14.GL_DEPTH_COMPONENT16, WIDTH, HEIGHT, 0,
GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, texture, 0);

GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
GL11.glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight());

Мои объекты отлично отображаются в моем средстве визуализации по умолчанию (выход vec4). Мой код шейдера теней прост:

#version 430
layout(location = 0) out float fragmentdepth;

void main(void){
    fragmentdepth =  gl_FragCoord.z;
}

Я попытался вывести vec4(1.0) без использования каких-либо FBO, и все работало нормально, поэтому мои расчеты верны, и мои коды шейдеров также должны работать.

Мой вызов отрисовки выглядит так:

GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT|GL11.GL_DEPTH_BUFFER_BIT);
renderShadows();
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
renderAllItems();
Display.sync(FPS_CAP);
Display.update();
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT|GL11.GL_DEPTH_BUFFER_BIT);
GL11.glClearColor(0.2f,0.1f,0.1f , 1f);

когда я вызываю "renderAllItems();" Я также визуализирую четырехугольник в правом верхнем углу, который должен отображать мою текстуру глубины. Но все, что я вижу, это красный квадрат. Разве он не должен быть черно-белым и что-то показывать?


person Finn Eggers    schedule 03.12.2016    source источник
comment
Я не могу заставить свою теневую систему работать должным образом. -› Я не могу заставить свою теневую систему работать должным образом.   -  person d0n.key    schedule 04.12.2016
comment
Буфер глубины не имеет цвета, он хранит глубину. Однако это один компонент, и его можно интерпретировать как любой цвет, который вы хотите... который обычно имеет тенденцию становиться красным каналом.   -  person Andon M. Coleman    schedule 04.12.2016
comment
Разве он не должен быть черно-белым и что-то показывать? Вы отображаете его как черно-белый?   -  person Nicol Bolas    schedule 04.12.2016
comment
Нет, я этого не делал. Но как я могу заставить свою программу отображать черно-белое изображение? просто вывести vec4 (color.r, color.r, color.r, 1.0)? И да, я знаю, что он хранит глубину. Я просто использовал цвета, чтобы показать, что мои шейдеры работают нормально.   -  person Finn Eggers    schedule 04.12.2016


Ответы (1)


GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, texture, 0);

Это прикрепляет текстуру к приложению глубины объекта кадрового буфера.

layout(location = 0) out float fragmentdepth;

Это определяемый пользователем вывод фрагментного шейдера. Пользовательские выходные данные сопоставляются с цветами фрагментов, которые записываются в цвет вложения FBO, а не глубинные вложения.

Глубина фрагмента — это то, что записывается во вложения глубины. А в FS это встроенный gl_FragDepth вывод. Тем не менее, у вас нет причин писать ему. Если в него не писать, то он автоматически заполнится gl_FragCoord.z.

В самом деле, если все, что вам нужно, это визуализировать глубину, вам не следует даже иметь фрагментный шейдер.

person Nicol Bolas    schedule 04.12.2016
comment
У вас есть ссылка на спецификацию для этого поведения при рендеринге без фрагментного шейдера? Единственное, что я обнаружил, это то, что если нет активной программы для этапов вершинного или фрагментного шейдера, результаты обработки вершин и/или фрагментов будут неопределенными. Поскольку gl_FragDepth является результатом обработки фрагмента, это не говорит мне, что в данном случае он будет определен. - person Reto Koradi; 04.12.2016
comment
ОМГ работает!!! :) Спасибо, Нико Болас. Я просто удалил весь свой контент в своем фрагментном шейдере и изменил отображаемую текстуру, чтобы она отображалась черно-белой. Большое Вам спасибо !! :) - person Finn Eggers; 04.12.2016
comment
@RetoKoradi: Поскольку gl_FragDepth является результатом обработки фрагмента Это не имеет значения, потому что: Если активный фрагментный шейдер не присваивает статически значение gl_FragDepth, то значение глубины, сгенерированное во время растеризации, используется последующими этапы трубопровода. Если фрагментного шейдера нет, то он не может назначить gl_FragDepth. И поэтому используется значение глубины, сгенерированное при растеризации. - person Nicol Bolas; 04.12.2016
comment
@RetoKoradi: Кроме того, есть еще вот что: шейдеры фрагментов определяют значения цвета для фрагментов, а также могут изменять или заменять назначенные им значения глубины. Обратите внимание, что здесь не говорится, что FS определяет значение глубины, а только то, что он может изменять или заменять его. - person Nicol Bolas; 04.12.2016