그림자 매핑을 작동 시키려고했으나 실패했습니다. 이제 프레임 버퍼에 아무 것도 쓸 필요가 없습니다. 텍스처로 쿼드로 렌더링합니다. 나는이 작은 코드 조각을 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로 앉아서 코드를 붙여 넣었다. (예, 알고있다 ... 그것보다 훨씬 좋아지지 않는다.) 이제는 작동한다. 감사 바트 :
답장을 보내 주셔서 감사합니다. 그래서 실제로 작동하게 만들었고 막 쓰려고했습니다. gl_fragDepth = 0.2f를 사용하여 제안한 것을 시도했지만 그 중 하나도 작동하지 않았습니다 (이 글을 게시하기 전에있었습니다). 나는 나의 TA 중 하나에서 도움을 받았고 어떤 이유로 그가 나와 함께 앉았을 때 코드 형식에 붙여 넣기 할 때 자습서가 작동했다. 어쨌든 고마워 :) – MulattoKid