ShaderFX 네트워크에서 For 루프 사용

사용자 정의 코드 노드 사용

다른 방법으로 For 루프를 만들 수 있습니다. 사용자 정의 코드 노드를 만들 수 있습니다. 도구 고급 모드 토글을 선택하여 고급 모드를 시작한 다음 하드웨어 셰이더 노드 다양 사용자 정의 코드를 선택합니다. 특성 패널에서 편집 버튼을 클릭하여 표시되는 사용자 정의 코드 편집기 대화상자에 코드를 입력합니다. DirectX 뷰포트 드라이버와 호환되는 함수를 사용합니다.

For 루프 노드 사용

또한 For 루프 노드를 만들려면 고급 모드에 있어야 합니다.

다음 예제에서는 여러 UV 오프셋을 사용하여 텍스처를 세 번 샘플링하는 For 루프 사용 방법을 보여줍니다. 샘플링된 값이 추가되고 전체를 3으로 나눈 다음 평균 값이 TraditionalGameSurfaceShader의 분산 색상 채널에 적용됩니다.

For 루프를 설정합니다.

  1. ShaderFX 작업 영역에서 마우스 오른쪽 버튼을 클릭하고 도구 고급 모드 토글을 선택하여 고급 모드가 활성화되었는지 확인합니다.
  2. 마우스 오른쪽 버튼을 클릭하고 하드웨어 셰이더 노드 흐름 컨트롤 For 루프를 선택하여 ForOp 노드를 만듭니다.
    팁: 사각형 포트에서 포트가 둘 이상의 입력을 허용할 수 있다는 것을 나타냅니다.
  3. 하드웨어 셰이더 노드 정수를 선택하여 정수 노드를 만듭니다. 특성 패널에서 해당 값을 3으로 설정합니다. For 루프 노드의 B 속성에 연결합니다.
    • A 속성은 루프의 시작을 나타냅니다.
    • B 속성은 루프의 끝을 나타냅니다.
    • C 속성은 루프의 간격을 나타냅니다.
    • 기본적으로 A 값은 0이고 C 값은 1입니다. 루프에 대해 이러한 기본값을 사용하는 경우 이들 속성을 연결하지 않아도 됩니다.

      이 예에서는 for i = 0, i < 3, i++를 설정합니다. 따라서 A와 C 값을 명시적으로 설정하지 않아도 됩니다.

  4. 하드웨어 셰이더 노드 다양 문자열을 선택하여 반복기로 사용하는 문자열을 만듭니다. 특성 패널의 기본 옵션 드롭다운 리스트에서 i를 선택합니다(이 선택을 보려면 아래로 스크롤해야 함). For 루프 노드의 반복기 속성에 문자열 노드의 출력 포트를 연결합니다.
  5. 하드웨어 셰이더 노드 Float3을 선택하여 루프 내에서 계산되는 값을 저장하기 위한 변수를 만듭니다.
    팁: Float3 또는 Float4를 사용하여 값을 저장합니다. 색상 노드를 사용하지 마십시오.
  6. 특성 패널에서 Float3 노드의 이름을 LoopResult로 바꾸고 세 값이 1.0으로 초기화되었는지 확인합니다.
  7. LoopResult 노드를 For 루프 노드의 변수 속성으로 연결합니다. 이 루프는 한 변수만 사용되는 간단한 루프이기 때문에 LoopResult를 For 루프의 출력 속성으로 역시 연결합니다.

텍스처 샘플링을 설정합니다.

  1. 하드웨어 셰이더 노드 텍스처 텍스처 맵을 선택하여 텍스처 맵 노드를 만듭니다. 특성 패널에서 MyTexture/경로 컨트롤을 사용하여 텍스처 파일을 이 노드에 할당합니다.

    또한 특성 패널에서 샘플러/U 좌표 및 샘플러/V 좌표 속성이 WRAP로 설정되었는지 확인합니다.

    텍스처가 오프셋으로 샘플링되기 때문에 샘플링이 0-1 UV 범위를 초과할 수 있습니다. 이러한 속성을 WRAP로 설정하면 UV 범위가 1.0으로 초과될 때 픽셀이 텍스처의 처음부터 샘플링되도록 합니다.

  2. 하드웨어 셰이더 노드 배열을 선택하여 배열 노드를 만듭니다. 세 세트의 오프셋 값이 이 배열에 저장됩니다.
  3. 하드웨어 셰이더 노드 Float2를 세 번 선택하여 세 Float2 노드를 만들어 세 세트의 오프셋 값을 저장합니다. 특성 패널을 사용하여 다음과 같이 세 Float2 속성을 설정합니다.
    • 이름: Offset1, X: 0.1, Y: 0.3
    • 이름: Offset2, X: 0.2, Y: -0.4
    • 이름: Offset3, X: 0.3, Y: 0.2
  4. 세 Float2 노드 모두를 배열 노드의 값 속성에 연결합니다.
  5. 하드웨어 셰이더 노드 공통 입력 UV 세트 및 하드웨어 셰이더 노드 수학 추가를 선택하여 UV 세트 노드 및 추가 노드를 만듭니다.
  6. 노드를 다음과 같이 연결합니다.
    • 배열의 값 속성을 추가의 값 속성에 연결합니다.
    • UV 세트의 UV 속성을 추가의 다른 값 속성에 연결합니다.
    • 추가의 결과 속성을 텍스처 맵의 UV 속성에 연결합니다.
    • 반복기(문자열 노드)의 출력 속성을 배열의 색인 속성에 연결합니다. 그러면 For 루프가 오프셋 값을 가져올 수 있습니다.
    • 텍스처 맵의 색상 속성을 For 루프의 계산 속성에 연결합니다. 그러면 For 루프에서 계산을 설정하여 텍스처 맵을 세 번 샘플링합니다.

샘플링된 결과의 평균을 계산합니다.

  1. 하드웨어 셰이더 노드 다양 문자열을 선택하여 문자열 노드를 만듭니다. 특성 패널의 기본 옵션 드롭다운 리스트에서 +=를 선택합니다.
  2. 새 문자열 노드의 출력 값을 For 루프 노드의 연산자 속성에 연결합니다.

    For 루프에서 텍스처 샘플링의 결과를 루프 결과 변수에 추가합니다.

  3. 하드웨어 셰이더 노드 수학 분할을 선택하여 분할 노드를 만듭니다. For 루프의 출력 속성을 분할의 첫 번째 값 속성에 연결합니다.

    루프 결과는 샘플링된 값의 합계이기 때문에 평균을 얻으려면 3으로 나누어야 합니다.

  4. 하드웨어 셰이더 노드 부동을 선택하여 부동 노드를 만듭니다. 특성 패널에서 해당 값을 3.0으로 설정합니다. 해당 부동 속성을 분할의 다른 값 속성에 연결하여 샘플링된 결과 합계를 3으로 나눕니다.
  5. 분할의 결과 속성을 TraditionalGamesSurfaceShader의 분산 색상 속성에 연결합니다.

체크무늬보드 패턴 반복 결과(Quicksilver 렌더러로 렌더링)

ShaderFX 재질을 셰이더 파일에 내보내고 셰이더 코드를 검사하여 방금 만든 for 루프를 볼 수 있습니다.

float3 LoopResult = float3(1.0, 1.0, 1.0);	
for(int i=0; i<3; i+=1)	
{		
    float2 AddOp = (Array_bphdfiwhhj[i] + IN.map1.xy);		
    float4 Sampler = chessboard_woodjpg.Sample(MMMLWWWSampler, AddOp);		
    LoopResult += Sampler.xyz;
}

셰이더 파일 내보내기에 대한 자세한 내용은 HLSL, CgFX , GLSL로 내보내기를 참조하십시오.