가장자리에 스카이 박스 텍스처 아티팩트


12

Mac에서 skybox 텍스처를 그리는 데 이상한 문제가 있습니다. iPhone에서는 모든 것이 잘 진행되고 있습니다. 나는 성공하지 않고 근거리와 원거리의 값을 바꾸려고 노력했다.

6 개의 텍스처로 구성된 스카이 박스이며 모든 텍스처에 대해 다음과 같이 설정했습니다.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

무엇이 문제 일 수 있습니까?

스크린 샷 :

보이는 스카이 박스의 가장자리가있는 하늘 이미지

편집하다:

텍스처를 통해 피가 나는지 확인하기 위해 배경색을 빨간색으로 설정하려고했습니다.

텍스처의 좌표를 다음과 같이 변경하려고했습니다.

float err_corr = 0.5 / TEXTURE_SIZE;

GLfloat vertices[24] = {    
        -1.0f - err_corr, -1.0f - err_corr,  1.0f + err_corr,
    1.0f + err_corr, -1.0f - err_corr,  1.0f + err_corr,
    -1.0f - err_corr,  1.0f + err_corr,  1.0f + err_corr,
    1.0f + err_corr,  1.0f + err_corr,  1.0f + err_corr,
    -1.0f - err_corr, -1.0f - err_corr, -1.0f - err_corr,
    1.0f + err_corr, -1.0f - err_corr, -1.0f - err_corr,
    -1.0f - err_corr,  1.0f + err_corr, -1.0f - err_corr,
    1.0f + err_corr,  1.0f + err_corr, -1.0f - err_corr,
    };

그리고 상자는 다음 순서로 그려집니다.
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};

해결책:

해결책은 큐브 맵 자체에 GL_CLAMP_TO_EDGE 를 설정 하는 것입니다!

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

답변:


8

각 개별 텍스처에 대해 GL_CLAMP_TO_EDGE 설정 했습니까? 이것은 개별 텍스처 상태의 일부이며 기본값은 GL_REPEAT로 설정되므로 glBindTexture로 바인딩 한 후에 수행해야합니다. 원래 게시물에서 문자 그대로 각 질감에 대해 설정했다고 말하지만 코드가 실제로 어떻게 보이는지 궁금합니다.

예를 들면 다음과 같습니다.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.

이것은 다음과 같지 않습니다 :

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

오류를 발견했습니다! 큐브 맵의 모든 텍스처에 대해 GL_CLAMP_TO_EDGE 를 설정하지 않고 cubemapp 자체에 설정해야했습니다! glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
마틴 Pilch 씨나

1

텍스처의 왼쪽과 오른쪽에서 '0.5f / texture_width'를 삽입하고 위와 아래에서 '0.5f / texture_height'를 삽입하십시오. 텍스쳐 샘플러는 일반적으로 텍셀 중심에서 샘플링하여 왼쪽과 오른쪽, 위쪽 및 아래쪽 (0 및 1 uv)에서 샘플러가 경계를 벗어날 때 얻는 텍셀의 50 %를 얻습니다. . 텍스처의 다른면 또는 기본 샘플링 색상입니다.


이것이 그가 GL_CLAMP_TO_EDGE세트 를 얻은 이유 이며, 범위를 벗어난 샘플은 텍스처 내 가장 가까운 픽셀 값을 가져와야합니다. 설명하는 내용이 효과가있을 수 있지만 처음에 문제가있는 이유는 설명하지 않습니다.
aaaaaaaaaaaa

나는 변화없이 그것을 시도했다 : /
martin pilch

0

MAC과 iPhone의 차이점은 MAC의 앤티 앨리어싱으로 인한 것 같습니다. 내 3D 프로그래밍은 약간 녹슬지 만 모든 정사각형을 동일한 메쉬 또는 이와 비슷한 것으로 만들어야합니다.

더러운 해킹 솔루션은 모든 사각형을 너무 크게 만들어 서로 겹치거나 자르고 그에 따라 UV 좌표를 조정하는 것입니다.


앤티 앨리어싱 (glDisable (GL_POLYGON_SMOOTH);)을 사용하지 않도록 설정했습니다. 나는 좌표 양식을 삼각형 스트립으로 스카이 박스를 그리기입니다 -1 1
마틴 Pilch 씨나

1
그것은 나에게 좋은 소리. 적어도 지금은 추측이 맞지 않지만 검은 색이 배경 출혈인지 또는 질감 가장자리가 검은 색으로 나타나는지 확인하여 문제를 좁힐 수 있습니다. 인공물 뒤에 어딘가에 빨간색 다각형을 배치하면 인공물이 색을 띠게됩니까?
aaaaaaaaaaaa

벽을 확장하려고하므로 벽이 겹칩니다 (eBusiness가 작성한 것처럼). 0.0001이면 충분합니다. UV 좌표를 변경할 필요가 없습니다.
zacharmarz

1/10000은 충분하지 않으며, 문제의 크기는 1/4에서 1/2 픽셀 범위에있는 것으로 보이므로 텍스처 크기에 따라 작동하는 최소 크기는 약 1/1000입니다. UV 좌표를 조정하지 않는 것은 텍스처의 특성상 시각적으로 시각적 인 점프가 눈에 띄지 않지만 여전히 잘못 될 수 있습니다. 어쨌든 해킹에 대한 추가 조언은 내가 이전에 언급 한 질문에 대한 답변에 따라 달라집니다.
aaaaaaaaaaaa

아티팩트는 텍스처를 통한 배경 출혈이 아닙니다. 변경하지 않고 배경색을 빨간색으로 설정했습니다. 또한 텍스처 좌표를 확장하는 시도
마틴 Pilch 씨나

0

이것은 구형 HW (또는 아이폰)의 큐브 맵에서 일반적으로 발생하는 문제입니다. 확인

GL_ARB_seamless_cube_map

당신의 hw에서 사용할 수 있다면 확장. 그렇다면. 문제를 해결하면 문제를 해결할 수 있습니다.


iPhone이 아닌 GeForce 9400M에 문제가 있습니다. 이 확장 프로그램은 사용할 수 없습니다.
마틴 필치

심리스 여부에 관계없이 큐브 맵으로 인한 문제는 아닙니다. 이것은 텍스처 래핑 문제입니다.
Tara

0

6 개의 텍스처가 구체적으로 큐브 맵으로 설정되어 있거나 스카이 박스면 각각이 자체 텍스처와 별도로 렌더링됩니까? 큐브 맵을 처리 할 때 일부 초기 PC 시스템은 큐브 가장자리 근처에서 샘플링 할 때 한면 텍스처에서 다른면 텍스처까지 ​​필터링 할 필요가 없다는 점에서 필터링 성능이 다소 떨어 졌다고 들었습니다 . AGIK SGX (iphone GPU)는 가장자리를 정확하게 필터링해야합니다.

당신의 측면 텍스처의 바닥은 인공물과 비슷한 파란색 음영으로 보입니다. 예를 들어, 픽셀의 맨 아래 줄 (또는 몇 줄)을 자홍색의 끔찍한 그늘로 만들고 그것이 인공물 색상을 바꾸는 지 확인할 수 있습니까? 그것은 일어날 수도 있고 일어나지 않을 수도있는 것에 대한 더 많은 아이디어를 줄 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.