2010-03-22 6 views
0

쉐이더가 조금씩 생기고 있습니다.이 이상한 편집 오류가 계속 발생하여 저를 미치게합니다! 픽셀 쉐이더 이상한 컴파일 오류

다음 픽셀 쉐이더 코드 :

  DirectionVector = normalize(f3LightPosition[i] - PixelPos); 
      LightVec = PixelNormal - DirectionVector; 

      // Get the light strenght factor 
      LightStrFactor = float(abs((LightVec.x + LightVec.y + LightVec.z)/3.0f)); 

      // TEST!!! 
      LightStrFactor = 1.0f; 

      // Add this light to the total light on this pixel 
      LightVal += f4Light[i] * LightStrFactor; 

완벽하게 작동하지만, 최대한 빨리 분리 할 때 "LightStrFactor = 1.0F;" 즉, 'LightStrFactor'값을 위 계산의 결과로두면 셰이더를 컴파일하지 못합니다.

LightStrFactor는 LightVal & f4Light [I]를 float4 모든 나머지 float3되어있는 플로트 이다.

왜 내 컴파일러가 컴파일되지 않는 것입니까? DX 컴파일러가 어떻게 플로트의 가치에 관심이 있습니까? 내 값이 정확하지 않더라도 런타임이 아니어야합니까? 쉐이더 컴파일 코드는 이것이다 : 어떤 도움이 감사 감사

/* Compile the bitch */ 
if (FAILED(D3DXCompileShaderFromFile(fileName, NULL, NULL, "PS_MAIN", "ps_2_0", 0, &this->m_pCode, NULL, &this->m_constantTable))) 
    GraphicException("Failed to compile pixel shader!"); // <-- gets here :(

if (FAILED(g_D3dDevice->CreatePixelShader((DWORD*)this->m_pCode->GetBufferPointer(), &this->m_hPixelShader))) 
    GraphicException("Failed to create pixel shader!"); 

this->m_fLoaded = true; 

! :]

+2

무엇이 오류 메시지입니까? 오류가 발생하여 컴파일하는 동안 시간을내어 보내면 시간을 절약 할 수 있습니다. – Coincoin

답변

0

셰이더는 컴파일 될 때 많이 최적화된다는 것을 잊지 마십시오. 이것은 값을 하드 코드 할 때 실패하지 않는 이유 일 수 있습니다.

방정식을 할당 한 직후에 값을 하드 코드하면 전체 방정식이 최적화되어 최종 할당 만 남게됩니다.

+0

전체 코드가 매우 부도덕하게 행동했으며 많은 설명 할 수없는 오류가있었습니다. "최적화"에 대해 언급 한 후 나는 갑자기 많은 쓸모없는 테스트 코드와 변수가 있음을 기억하고 분명히 카드 나 다른 모든 공간을 소비했습니다. 그 (것)들을 맑게하고 모두를 능률적으로 다시 쓰는 것은 일했다. 덕분에 :) – ytrewq

0

픽셀 쉐이더는 C++ 스타일의 캐스트를 지원하지 않습니다. 예를 들어, float( ... )입니다. 완전히 중복되었으므로 제거 할 수는 있지만 캐스트를 원한다면

+0

실제로 그들은 그것을 허용합니다. 적어도 내가 사용하고있는 버전에서. 어쨌든 고마워요 – ytrewq

+0

캐스트를 완전히 제거하면 어떻게됩니까? – Goz

0

의 쉐이더 코드 조각을 보면 쉐이더 코드 조각을 통해 여러 개의 조명을 반복하여 그 기여도를 축적하는 것처럼 보입니다 .

내 생각에 컴파일러가 실제 쉐이딩 계산으로 루프를 풀 때 컴파일 된 쉐이더는 ps_2_0 프로파일이 지원하는 것보다 더 많은 산술 명령어 슬롯을 사용합니다 (최대 64 개 명령어).

LightStrFactor = 1로 계산을 바꾸면 컴파일러가 앞에있는 세 개의 코드 줄을 완전히 최적화하므로 테스트 쉐이더가 상당히 짧아 지므로 할당 된 64 개 명령어 안에 들어갑니다.

응용 프로그램 하드웨어 타겟에서 가능한 경우 셰이더 프로필 버전을 부딪히면 셰이더가 더 많은 명령 슬롯을 사용하고 오류없이 컴파일 할 수 있습니다. ps_3_0/ps_2_a/ps_2_b 중 하나라도 쉐이더를 컴파일 할 수 있어야합니다. (2_a/b 프로필은 완전히 나쁜 놈이지만 공식적으로 지원되는 NV/ATI는 기본 2_0 프로필로 확장됩니다.)

(다른 답변에서 언급했듯이 컴파일 오류를 캡처하고 인쇄하면 시간이 오래 걸릴 것입니다. while.)