GL_REPEAT를 사용하여 텍스처 아틀라스를 선택하는 방법은 무엇입니까? (OpenGL)

StackOverflow https://stackoverflow.com/questions/662107

문제

텍스처 아틀라스를 어떻게 반복 할 수 있습니까?

예를 들어, 내 스프라이트 (선택)는 텍스처 좌표 내에 있습니다.

GLfloat textureCoords[]=
{
    .1f,  .1f,
    .3f,  .1f,
    .1f,  .3f,
    .3f,  .3f
};

그런 다음 그 스프라이트를 반복하고 싶습니다 n 시간 정의 된 삼각형 스트립 (또는 쿼드)에 :

GLfloat vertices[]=
{
   -100.f, -100.f,
    100.f, -100.f,
   -100.f,  100.f,
    100.f,  100.f
};

나는 그것이 관련이 있다는 것을 알고 있습니다 GL_REPEAT 그리고 TextUrecoord가 범위를 통과했습니다 [0,1]. 그러나 이것은 작동하지 않습니다 : (n = 10을 반복하려고합니다)

GLfloat textureCoords[]=
{
    10.1f,  10.1f,
    10.3f,  10.1f,
    10.1f,  10.3f,
    10.3f,  10.3f
};

우리는 우리의 전체 질감 아틀라스가 반복되는 것을보고 있습니다 ...

올바른 방법으로 어떻게해야합니까?

도움이 되었습니까?

해결책

질문에 설명 된 방식으로는 할 수 없습니다. OpenGL의 텍스처 좌표 모드는 전체 텍스처에만 적용됩니다.

일반적으로 질감을 반복하려면 질감이 암시하는 것보다 "큰"다각형을 그립니다. 예를 들어, 더 큰 영역에서 여러 번 반복하고 싶었던 사각형 질감이 있다면 키가 6 배나 큰 사각형을 그립니다. 그런 다음 텍스처 좌표를 (0,0)-(6,1)로 설정하고 텍스처 모드를 "반복"으로 설정합니다. 다각형을 가로 질러 보간 할 때, 1을 넘어선 텍스처 좌표는 반복적으로 활성화되어 질감으로 "주위를 감싸서"텍스처가 사각형을 가로 질러 6 번 맵핑됩니다.

텍스처 랩 모드 중 어느 것도 질문에 설명 된대로 작동의 종류를 지원하지 않습니다. 즉, 임의의 하위 집합이 아니라 전체 [0,1] 범위에 매핑됩니다. 텍스처의 일부만 사용하여 텍스처링을 할 때, 더 큰 텍스처 좌표가 OpenGL이 하위 응집 조랑 내에서만 반복하도록하는 방식으로 지정할 수있는 방법은 없습니다.

기본적으로 두 가지 선택이 있습니다. 기존 텍스처에서 필요한 스프라이트 만있는 새로운 텍스처를 만들거나 GLSL Vertex 프로그램을 작성하여 텍스처 좌표를 적절하게 매핑하십시오.

다른 팁

당신이 그렇게 할 수 있는지 잘 모르겠습니다. OpenGL의 텍스처 좌표 모드는 전체 텍스처에만 적용됩니다. Atlas를 사용할 때는 "하위 텍사스"를 사용하여 텍스처 좌표가 0과 1에 가까워지지 않도록 래핑 및 클램핑이 발생하는 정상 한계입니다.

이것을 다루기위한 확장이있을 수 있습니다. 나는 확인하지 않았습니다.

편집 : 일반적으로 질감을 반복하려면 질감이 암시하는 것보다 "더 큰"다각형을 그립니다. 예를 들어, 더 큰 영역에서 여러 번 반복하고 싶었던 사각형 질감이 있다면 키가 6 배나 큰 사각형을 그립니다. 그런 다음 텍스처 좌표를 (0,0)-(6,1)로 설정하고 텍스처 모드를 "반복"으로 설정합니다. 다각형을 가로 질러 보간 할 때, 1을 넘어선 텍스처 좌표는 반복적으로 활성화되어 질감으로 "주위를 감싸서"텍스처가 사각형을 가로 질러 6 번 맵핑됩니다.

이것은 이미지없이 설명하기가 약간 조잡합니다.

어쨌든, 텍스처의 일부만 사용하여 텍스처링을 할 때, 더 큰 텍스처 좌표가 OpenGL이 하위 교체 내부에서만 반복하도록하는 방식으로 지정할 수있는 방법은 없습니다.

텍스처 랩 모드 중 어느 것도 찾고있는 작업의 종류를 지원하지 않습니다. 즉, 모두 임의의 하위 집합이 아니라 전체 [0,1] 범위에 매핑됩니다. 기본적으로 두 가지 선택이 있습니다. 기존 텍스처에서 필요한 스프라이트 만있는 새로운 텍스처를 만들거나 GLSL 픽셀 프로그램을 작성하여 텍스처 좌표를 적절하게 매핑하십시오.

이것은 오래된 주제 일 수 있습니다. 내가 어떻게하는지는 다음과 같습니다.

해결 방법은 텍스처 UV의 서브 세트를 포함하는 여러 메쉬를 만들어내는 것입니다.

EG : U [0.05-0.1] & V [0.05-0.1]에서 더 큰 질감 아틀라스에 레이저 텍스처가 포함되어 있습니다.

그런 다음 N 메쉬를 구성 할 수 있으며 각각 u [0.05-0.1] & v [0.05-0.1] 좌표가 있습니다. (n = 길이 / 텍스처. 높이; 높이는 내가 반복하고 싶은 질감의 치수입니다.

이 솔루션은 텍스처 후 텍스처를 다시로드하는 것보다 비용 효율적입니다. 특히 모든 렌더링 호출을 배치하는 경우 (필요한대로).

(OpenGL ES 1.0,1.1,2.0 -Mobile Hardware 2011)

할 수 없습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top