2016-11-26 5 views
1

그림자 매핑을 작동 시키려고했으나 실패했습니다. 이제 프레임 버퍼에 아무 것도 쓸 필요가 없습니다. 텍스처로 쿼드로 렌더링합니다. 나는이 작은 코드 조각을 10 시간 동안보고 있었으므로 마침내 도움을 청할 때가왔다. 더 자세한 정보가 필요하거나 뭔가 명확하지 않은 경우 알려주십시오.OpenGL - 프레임 버퍼에 쓸 수 없거나 제대로 읽을 수 없습니다.

나는 이것을에 따라 시작했다. 두 번 완료 한 후 세 번째로 붙여 넣은 직선 복사를 끝내고 다른 곳에서 정보를 찾기 시작했습니다. 내 현재 코드는 다소 혼란 스럽지만 중요한 것을 추출하려고 시도했습니다.

다음은 TEXTURE2D로 FBO를 설정하는 방법입니다 (_shadowMap 및 _shadowMapFBO는 주 프로그램의 클래스에서 private 변수입니다) :

glGenTextures(1, &_shadowMap); 
glBindTexture(GL_TEXTURE_2D, _shadowMap); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); 

glGenFramebuffers(1, &_shadowMapFBO); 
glBindFramebuffer(GL_FRAMEBUFFER, _shadowMapFBO); 
glDrawBuffer(GL_NONE); 
glReadBuffer(GL_NONE); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, _shadowMap, 0); 
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
{ 
    std::cout << "Frame buffer failed" << std::endl; 
    system("pause"); 
    exit(1); 
} 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

난 후 처음으로 메인 루프에서 패스 렌더링을 수행합니다

glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT); 
glBindFramebuffer(GL_FRAMEBUFFER, _shadowMapFBO); 
glClear(GL_DEPTH_BUFFER_BIT); 
_shadowShader.bind(); 
glBindVertexArray(_cubeVAO); 
glDrawElements(GL_TRIANGLES, _numberOfIndicesCube, GL_UNSIGNED_SHORT, 0); 
glBindVertexArray(_planeVAO); 
glDrawElements(GL_TRIANGLES, _numberOfIndicesPlane, GL_UNSIGNED_SHORT, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glDrawBuffer(GL_BACK); 
glReadBuffer(GL_BACK); 

가 처음에 나는 그림자 맵을 만들고 싶었하지만이 시점에서 나는 단순히 명시 적 값을 쓰기 위해 노력하고있어 다음 음영을 사용하여 프레임 버퍼에 연결된 전체 텍스처에 적용

glViewport(0, 0, _screenWidth, _screenHeight); 
glClearColor(0.7f, 0.5f, 0.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
_testShader.bind(); 
glBindTexture(GL_TEXTURE_2D, _shadowMap); 
glBindVertexArray(_quadVAO); 
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); 

: R 쌍 (_shadowShader에서 사용하는)

정점

#version 450 

in layout(location=0) vec3 position; 

uniform mat4 mvp; 

void main() 
{ 
    gl_Position = mvp * vec4(position, 1.0f); 
} 

조각

#version 450 

out float depth; 

void main() 
{ 
    depth = 0.0f; 
} 

나는 다음 쿼드에 텍스처를 표시하려고으로 마무리 다음은 쿼드에 대한 프래그먼트 셰이더입니다.

#version 450 

in vec2 textureCoordinates; 

uniform sampler2D _shadowMap; 

out vec4 color; 

void main() 
{ 
    float depth = texture2D(_shadowMap, textureCoordinates).r; 
    color = texture2D(_shadowMap, textureCoordinates); 
} 

단편 쉐이더에서 0.0f (검은 색)를 출력해도 연속적인 좌절감으로 쿼드가 흰색으로 보입니다. 쿼드는 텍스처를 표시 할 수 있습니다. 그것에 .jpg를 표시하는 정상적인 텍스처. 그래서, 지금 제가있는 곳입니다. 어떤 아이디어, 포인터, 생각, 동기 부여 단어 등?

EDIT I ​​: 이제 더 이상 시간이 지나면 텍스쳐가 올바르게로드되었고 읽을 수 있음을 알게되었습니다. 초기화 할 때 이미지를 실제로로드 한 다음 쓰기 작업을 수행하여이 작업을 수행했습니다. 그런 다음 쿼드는 텍스처를 올바르게 표시합니다. 그래서 내가 쓰고있는 방식에 뭔가 잘못된 것이 있어야합니다.

EDIT II : 그래서 제대로 작동합니다. 나는 TA로 앉아서 코드를 붙여 넣었다. (예, 알고있다 ... 그것보다 훨씬 좋아지지 않는다.) 이제는 작동한다. 감사 바트 :

답변

0

당신의 그림자 패스 단편 쉐이더는 잘못된 것입니다 :

#version 450 

out float depth; 

void main() 
{ 
    depth = 0.0f; 
} 

이것은 당신이하지 않는 (단일 채널을 색 첨부 파일에 기록됩니다 색상 출력을 선언 않습니다 있다). FBO의 depth attachment에 쓰기를 원하기 때문에 내장 변수 gl_FragDepth을 사용해야합니다. 만약하지 않는다면, GL은 linearityy 보간 된 윈도우 공간 깊이 값을 깊이 버퍼에 씁니다.

일반적으로 깊이 버퍼를 1.0으로 지우고 일반적인 투시 투영을 사용하면 객체가 깊이 값으로 0.99something과 같이 1.0에 매우 가깝게 표시되므로 매우 변환 가능성이 높습니다 8 비트 회색조의 결과는 모두 흰색으로 보입니다.

+0

답장을 보내 주셔서 감사합니다. 그래서 실제로 작동하게 만들었고 막 쓰려고했습니다. gl_fragDepth = 0.2f를 사용하여 제안한 것을 시도했지만 그 중 하나도 작동하지 않았습니다 (이 글을 게시하기 전에있었습니다). 나는 나의 TA 중 하나에서 도움을 받았고 어떤 이유로 그가 나와 함께 앉았을 때 코드 형식에 붙여 넣기 할 때 자습서가 작동했다. 어쨌든 고마워 :) – MulattoKid

관련 문제