2016-12-03 9 views
0

Я не могу заставить свою теневую систему работать правильно. Я использую следующий код для создания моих 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) без использования каких-либо FBOs, и все это прекрасно работает, так что мои расчеты верны и мои шейдерных коды должны работать.

Мой вызов отрисовки выглядит следующим образом:

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

+0

«Я не могу заставить свою теневую систему работать правильно». -> «Я не могу заставить свою теневую систему работать правильно». – Unknown

+0

Буфер глубины не является цветом, он хранит глубину. Это один компонент, хотя и это можно интерпретировать как любой цвет, который вы хотите. Обычно он становится красным. –

+0

"* Не должен ли он быть черно-белым и показывать что-то? *" Вы представляете его как "черный/белый"? –

ответ

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

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

layout(location = 0) out float fragmentdepth; 

Это user-defined output from a fragment shader. Выделенные пользователем выходы отображаются на цвета фрагментов, which get written - цветные вложения из FBOs, а не на глубинные вложения.

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

Действительно, если все, что вы хотите, это сделать глубину, вы shouldn't even have a fragment shader.

+0

Есть ли у вас спецификация для этого поведения при рендеринге без фрагментарного шейдера? Единственное, что я нашел, это то, что «Если нет активной программы для этапов вершинного или фрагментарного шейдера, результаты обработки вершин и/или фрагментов будут неопределенными». Поскольку 'gl_FragDepth' является результатом обработки фрагментов, это не говорит мне, что он будет определен в этом случае. –

+0

OMG это работает !!! :) Спасибо, Нико Болас. Я просто удалил весь свой контент в моем шейдере фрагмента и изменил отображаемую текстуру, чтобы показать черно-белое. Большое спасибо !! :) –

+0

@RetoKoradi: "* Поскольку' gl_FragDepth' является результатом обработки фрагментов * «Это не имеет значения, потому что:« Если активный шейдер фрагмента не статически присваивает значение «gl_FragDepth», то значение глубины, генерируемое во время растеризация используется на последующих этапах трубопровода ». Если нет шейдера фрагмента, тогда он не может назначить 'gl_FragDepth'. И поэтому используется значение глубины, генерируемое во время растеризации. –