2016-12-03 6 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)을 시도하고 모든 그래서 내 계산이 정확 내 쉐이더 코드는 잘 작동한다 괜찮 았는데.

내 그리기 호출은 다음과 같습니다

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); 

I 전화 "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 ~ 색 첨부 FBO 인의 단편 색상으로 매핑되며 깊이 첨부는 포함되지 않습니다.

조각의 깊이는 깊이 첨부 파일에 기록됩니다. FS에서는 built-in gl_FragDepth output입니다. 그러나, 당신이 그것에 쓸 이유가 없습니다. 쓰기를하지 않으면 자동으로 gl_FragCoord.z으로 채워집니다.

실제로 원하는 경우 모두 깊이를 렌더링하는 것이면 shouldn't even have a fragment shader입니다.

+0

프래그먼트 셰이더없이 렌더링 할 때이 동작에 대한 스펙 참조가 있습니까? 내가 찾은 유일한 것은 "정점 또는 조각 쉐이더 단계에 대한 활성 프로그램이 없으면 정점 및/또는 조각 처리 결과가 정의되지 않습니다"입니다. 'gl_FragDepth'는 프래그먼트 처리의 결과이기 때문에이 경우에 정의 될 것이라고 알려주지 않습니다. –

+0

OMG 작동! 고마워요, Nico Bolas. 방금 조각 쉐이더에서 모든 내용을 삭제하고 표시 텍스처를 검정/흰색으로 변경했습니다. 대단히 감사합니다 !! :) –

+0

@RetoKoradi : "*'gl_FragDepth'는 조각 처리의 결과입니다. *"그 이유는 중요하지 않습니다 : "활성 조각 쉐이더가 정적으로 gl_FragDepth에 값을 지정하지 않으면 그 동안 생성 된 깊이 값 래스터 화는 파이프 라인의 후속 단계에서 사용됩니다. " 프래그먼트 셰이더가 없다면,'gl_FragDepth'에 할당 할 수 없습니다. 따라서 래스터 화 중에 생성 된 깊이 값이 사용됩니다. –

관련 문제