2012-11-22 4 views
0

(8 정점, 나는 인덱스 삼각형을 사용) :하나의 사각형 (두 개의 연결된 쿼드) - 공통 테두리 오류 나는 사각형 두 개의 쿼드로 구성되어 있습니다

------+------ 
| \ | \ | 
| \ | \ | 
| \ | \ | 
______+______ 

나는에도 두 가지 텍스처가 그것. 나는 그 둘을 쉐이더에 묶는다.

직사각형의 한 부분 (왼쪽 쿼드)을 첫 번째 텍스처로 텍스처링하고 다른 부분을 두 번째 텍스처로 텍스처를 만들고 싶습니다.

그러나 픽셀 쉐이더에서 버텍스 위치를 기준으로 텍스처를 선택하면 "+"로 표시된 버텍스에 문제가 있습니다. 한 번은 첫 번째 쿼드에서 "+"버텍스를 분석하지만 동일한 위치의 버텍스는 두 번째 쿼드에 있습니다 (두 번째 텍스처가 있어야 함). 따라서 위치를 기준으로 텍스처를 설정하면 오류가 발생합니다.

샘플러에서 할당 할 텍스처를 결정하는 방법은 무엇입니까? 두 번째 패스를 만들거나 쉐이더에 추가 정보를 추가하고 싶지 않습니다 (옵션이없는 경우).

기본적으로 말하기 : 모델과 가장자리가 있습니다. 그 가장자리는 텍스처가 변경되는 위치를 알려줍니다. 그러나 그 목표를 달성하는 방법? 해당 가장자리의 정점에 texture1 또는 texture2를 설정하면 오류가 발생합니다.

+0

질문이 명확하지 않습니다. 내가 올바르게 이해하는지 봅시다. 두 텍스처를 셰이더에 바인딩합니다. 정점의 값에 따라 쉐이더 내부에서? 색인의 가치? 변환 된 정점의 값은? 샘플링 할 텍스처를 선택합니다. 나는 정확하게 이해 했는가? 귀하의 질문을 편집하여 정확히 무엇을하고 어떤 순서로 쉐이더를 정점이나 픽셀이라고 설명 하시겠습니까? –

답변

1

나는 당신의 접근 방식이 잘못되었다고 생각합니다. 셰이더의 조건부 분기는 쉐이더를 느려지므로 가능한 경우 피해야합니다. 그 이유는 셰이더가 병렬로 각 픽셀에 대해 동일한 코드를 실행하도록 최적화되어 있기 때문입니다. grphics 카드 구현에 따라 쉐이더에 조건을 넣으면 다음 중 하나가 발생합니다. 쉐이더는 조건의 두 가지 분기를 실행하고 실행 후 각 픽셀에 적절한 경로를 선택하거나 모든 픽셀이 가장 긴 경로까지 대기하도록합니다 계속하기 전에 조건의 실행이 완료되었습니다.

두 개의 텍스처로 하나의 프리미티브를 그리려는 경우. 이런 식으로 정의 할 때 실제로는 가능하지 않습니다. 당신이 개념을 변경하는 경우 당신이 원하는 효과를 쉽게 얻을 수있다 :

  1. 첫 번째 및 간단한 오 두 개의 쿼드 각을 그릴된다

    나는 두 가지 방법을 생각할 수를 (더있을 수 있습니다) 그것은 자신의 질감입니다. 실제로 셰이더를 두 번 호출 할 것이지만 정확한 픽셀 수가 어쨌든 그려지기 때문에 실제 속도는 거의 느려지지 않습니다.

  2. 두 번째 방법은 다소 복잡하지만 한 번만 그릴 수 있습니다. 당신이해야 할 일은 두개의 텍스쳐를 포함하는 하나의 커다란 텍스쳐를 만들어서 전체 텍스쳐를 전체 삼각형 스트립에 맵핑하는 것입니다. 이 방법으로 렌더러는 각 쿼드가 "자체"텍스처를 갖도록합니다. OpenGl의 경우 glTexSubimage2D을 사용합니다. Direct3D를 9 년은 더 복잡 다음과 같은 순서를 사용
    A.이 D3DXLoadSurfaceFromMemory()
    D.를 사용하여 표면에 이미지를로드 IDirect3DTexture9::GetSurfaceLevel()
    C를 사용하여 레벨 0 CreateTexture
    B. 받기 표면을 사용하여 텍스처 만들기 표면을 놓으십시오.

그래서 수평 텍스처 좌표를 0부터 0.5까지 첫 번째 쿼드의 정점에 매핑하고 0.5에서 1까지의 좌표를 두 번째 쿼드의 정점에 매핑합니다.쿼드의 크기가 같지 않거나 텍스쳐가 같은 크기가 아니면

셰이더에서 조건 분기를 사용하려는 경우 픽셀의 열에 대해 이야기하고 있다는 것을 기억해야합니다 단지 약 2 개의 정점 (결국 픽셀 쉐이더)이므로 모든 픽셀을 확인해야합니다. 변환이 없으면 각 픽셀에 대한 변환 결과를 알 수있는 방법이 없으므로 문제 일 수 있습니다. 픽셀 쉐이더에서 꼭지점 값을 쿼리하지 않는 것이 가장 좋습니다.

희망 사항은 올바른 방향으로 이동합니다.