2011-10-31 3 views
2

큐브 맵과 그림자 맵핑을 2D 텍스처로 한 방향으로 해봤지만 모든 방향으로 그림자 맵핑을위한 큐브 맵을 사용하면 많은 문제가 발생합니다.무지 향성 그림자 맵

저는 최근에 textureCube()에서 얻은 깊이 값이 항상 0이라는 것을 알았습니다. 나는 2D 텍스쳐의 환경 맵과 쉐도우 맵핑과 비슷한 코드를 사용하고 있었기 때문에 gDEBugger가 쉐도우 맵이 메모리에 제대로 복사되고 있음을 보여주기 때문에이 라인이 작동한다고 가정했습니다. 여기

합니다 ... else 항상 촬영

uniform samplerCube shadowMap; 
varying vec3 worldFragPosition, worldLightPos; 

... 

vec3 lightToFrag; 
float shadowMapDepth; 
bool inShadow; 

inShadow = false; //used to darken color at the end 
if (shadowMapEnabled) 
{ 
    lightToFrag = worldFragPosition - worldLightPos; 
    shadowMapDepth = textureCube(shadowMap, lightToFrag).r; 

    if (shadowMapDepth > .75) 
    { 
     gl_FragColor = vec4(1.0, 0.0, 0.0, 0.0); 
     return; 
    } 
    else if (shadowMapDepth > .5) 
    { 
     gl_FragColor = vec4(0.0, 1.0, 0.0, 0.0); 
     return; 
    } 
    else if (shadowMapDepth > .25) 
    { 
     gl_FragColor = vec4(0.0, 0.0, 1.0, 0.0); 
     return; 
    } 
    else if (shadowMapDepth > 0.0) 
    { 
     gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0); 
     return; 
    } 
    else if (shadowMapDepth < 0.0) 
    { 
     gl_FragColor = vec4(1.0, 0.0, 1.0, 0.0); 
     return; 
    } 
    else 
    { 
     //... shadow mapping code 
    } 
} 

내 디버깅 테스트와 함께 그림자 매핑에 사용되는 쉐이더 코드의 일부 장면은 모든 것이 현재에 그늘이 (깨진 그림자 매핑 코드를 사용하여 렌더링 비교 깊이가 0이므로).

나는 그것이 0이 아닌지를 확인하기 전에 lightToFrag을 테스트했으며 shadowMapDepth을 플로트 임에도 불구하고 명시 적으로 테스트했습니다. 나는 또한 그것이 0 벡터가되도록 textureCube(shadowMap, lightToFrag)의 전체 반환 값을 테스트했습니다.

내가 생각할 수있는 유일한 깊이 텍스처가 제대로 바인더 제본되지 않은,하지만 난 아무것도 잊고 있다고 생각하지 않는 경우가 될 것입니다 항상 0입니다 이유에 ...

samplerShadowMapLoc = glGetUniformLocation(progId, "shadowMap"); 
shadowMapEnabledLoc = glGetUniformLocation(progId, "shadowMapEnabled"); 

    .... 

glUniform1i(shadowMapEnabledLoc, true); 
glActiveTexture(GL_TEXTURE3); 
glBindTexture(GL_TEXTURE_CUBE_MAP, light->getShadowMap()->getShadowMapId()); 
glUniform1i(samplerShadowMapLoc, 3); 

for (unsigned int i=0; i < objects.size(); i++) 
    if (objects.at(i)->getID() != light->getParent()->getID()) //don't draw light, it doesn't need shadows 
     render(objects.at(i)); 
glUniform1i(shadowMapEnabledLoc, false); 
render(light->getParent()); 

glUniform1i(shadowMapEnabledLoc, false); 

무엇이 textureCube가 0 벡터를 반환하게할까요? 어떤 도움을 주시면 감사하겠습니다.

+0

어쩌면 [this] (http://http.developer.nvidia.com/GPUGems/gpugems_ch12.html)를보고 도움을 받으려고 시작 했으므로 정말 도움이되지 않습니다 ... – niktehpui

답변

1

최신 하드웨어 만 렌더링 - 깊이 - 큐브 맵을 지원하며 최신 드라이버가 있어야합니다. 또한 지원되는 형식을 사용해야합니다. 카드의 사양을 확인하십시오. 그러나 이것이 가장 명백한 가능한 문제입니다.

+0

답장을 보내 주셔서 감사합니다. 내 노트북에는 ATI Mobility Radeon HD 4200 카드가 있습니다. http://feedback.wildfiregames.com/report/opengl/device/Mobility%20Radeon%20HD%204200에서 깊이 큐브 맵을 지원하는지 확인할 수있었습니다. 나는 드라이버를 업데이트했다 (v 11.11). 어떤 깊이 형식이 지원되는지 정확히 알 수는 없지만 2 차원 텍스처로 단일 방향 그림자 매핑에 사용한 것과 동일한 것을 시도해 보았습니다 : GL_DEPTH_COMPONENT. 나는 16 및 32 비트 버전에 빠른 테스트를 제공했지만 운이 없었습니다. – CCSeth

0

이것은 아마도별로 도움이되지 않을 것입니다. (큐 맵으로 한 번에 옴니 섀도우를 만드는 올바른 방법을 알고 싶습니다. 찾을 수있는 정보는 아무 것도 없지만 도움이 될만한 것은 아닙니다.) .. ..

큐브 맵에 올바르게 렌더링 하시겠습니까? this SO question에 따르면 큐브 맵에 렌더링 할 기하학 셰이더가 필요합니다.

+0

답장을 보내 주셔서 감사합니다. 기하학 셰이더 사용에 대해 언급 한 리소스 중 일부를 기억하지 못합니다. 나는 그 질문이 같은 목적을위한 그것의 적용과 관련이 있다고 생각한다. 나는 거의 긍정적이다. 큐브 맵에 올바르게 렌더링하는 것은 gDEBugger 도구에서 프로그램을 일시 중지하고 텍스처 메모리를 살펴볼 때 객체의 깊이 큐브 맵을 볼 수 있기 때문이다. – CCSeth