2013-03-03 2 views
2

텍스처를로드하고 큐브와 평면에 표시했습니다. 비행기와 정육면체가 교차하는 지점에는 추악한 시각적 인공물이 있습니다. 여기텍스처의 intesection에서 OpenGL이 실패합니다.

문제 보여주는이 사진은 다음과 같습니다

Image2 - how to fix?

: - : - 동일한 시나리오, 다른 관점

Image1 - what is this?

이미지 2

이미지 1을 어떤이있다 다음은 이미지를로드하는 방법입니다.

static const GLenum gl_format[4] = { GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGR, GL_BGRA }; 

GLuint LoadTGATexture(const char* filename) 
{ 
    //image is already loaded in --- unsigned char[] data - int width - int height - int components 
    unsigned int handle; 

    glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_anisotropy); 

    glGenTextures(1, &handle); 
    glBindTexture(GL_TEXTURE_2D, handle); 

    glTexImage2D(GL_TEXTURE_2D, 0, components, width, height, 0, gl_format[components - 1], GL_UNSIGNED_BYTE, data); 
    gluBuild2DMipmaps(GL_TEXTURE_2D, components, width, height, gl_format[components - 1], GL_UNSIGNED_BYTE, data); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy); 
    glBindTexture(GL_TEXTURE_2D, 0); 

    delete [] data; 
    return handle; 
} 

어떻게 해결할 수 있습니까? 내 실수는 무엇입니까?

+2

그냥 추측 할 만하지만 가까운 거리와 먼 거리의 클리핑면 사이에 ** 거대한 ** 차이가있는 원근감 행렬을 가질 수 있습니까? – antonijn

+0

예, 0.00001과 10000.0 -> 너무 큽니다. - 그러나 비행기가 다른 비행기와 정확히 겹치면 여전히 약간의 줄무늬 (0.01와 먼 100.0 근처)가 있습니다. – bricklore

+2

'멀리'는별로 문제가되지 않습니다. 실제 문제는 '근접'입니다. 근거리 비행기를 0.01로 설정하면 멀리있는 비행기가 아주 가깝더라도 Z 버퍼 범위의 ~ 50 %가 0.01에서 0.02 사이입니다. – JasonD

답변

3

나는 당신의 질감과 아무 관계가 없다고 생각합니다.

외모로 보면 클리핑에 문제가 있습니다. glEnable(GL_DEPTHTEST)을 확인하고, 원근 행렬을 설정할 때 근거리 평면이 >0.0 (0.0이 아니라 음수가 아님)을 의미하는지 확인하십시오. 또한 멀리 비행기가 대단히 거대한 숫자가 아닌지 확인하십시오. 나는 정상적으로 1000.0에서 멈추고 좋은 결과를 얻는다. 너는 더 작은 것을하고 싶을지도 모른다.

+0

감사합니다! 지금은 정말 나아! 하지만 비행기가 다른 비행기와 정확히 겹치면 여전히 줄무늬가 있습니다. 어떤 제안이 있습니까? – bricklore

+2

@ Schnizel1337 비행기가 정확히 겹치면 할 수있는 것이 없습니다. 당신은 "z fighting"이라는 이슈에 부딪 칠 것입니다. 구글 그것. 일반적으로 지오메트리의 정확한 오버랩을 피하고자합니다. – Bart

+3

이것은 클리핑 (clipping)이라고는하지는 않지만 심도 깊은 투쟁이라고합니다. 또한 먼 평면 거리는 훨씬 덜 중요한 평면 거리입니다. 깊이 버퍼 해상도는 1/x와 같습니다. 따라서 가까운 평면을 원점으로 더 가까이 갈수록 먼 거리에서 느슨해 진 깊이 해상도가 높아집니다. 원거리 클리핑 평면을 향한 정밀도는 선형 진행에 가까워지고 있으므로 더 먼 거리로 인한 정밀도 저하는 그다지 중요하지 않습니다. 따라서 가까운 클립 평면 거리를> 0이 아닌 가능한 한 크게 선택해야합니다. – datenwolf

관련 문제