2011-11-08 2 views
2

나는 문제가 무엇인지 더 잘 보여주기 위해이 첫 번째 게시물을 완전히 다시 작성했습니다.HLSL의 벡터 오류 정규화

ps v1.4 (지원 대상이 가장 높은 버전)를 사용 중이며 계속 오류가 발생합니다.
cosh, dot, distance, sqrt와 같은 함수를 픽셀 쉐이더에 전달 된 어떤 식 으로든 사용하면 언제든지 발생합니다.
예를 들어 pixelhader에서 점 광원을 사용하려면 "normalize (LightPosition - PixelPosition)"을 수행해야하지만 정상화하면 오류가 발생합니다.
몇 가지주의 사항 -
pow, abs 및 radians 같은 것을 오류없이 사용할 수 있습니다.
버텍스 쉐이더에서 전달 된 항목에 오류가있는 경우에만 오류가 발생합니다. (예를 들어, sqrt의 로컬 pixelshader 변수를 오류없이 사용할 수 있습니다.)
전달 된 모든 변수, 심지어 텍스트 좌표, 색상 등에서 오류가 발생합니다.
내가 할 수있는 버텍스 셰이더 안에 오류없이 전달 된 모든 변수에 대해 이러한 함수가 모두 있습니다. 오류가 발생하는 것은 pixelshader에서만입니다.
정점에서 픽셀 쉐이더로 전달되는 모든 값은 정확합니다. 하드웨어가 아닌 소프트웨어 처리를 사용하면 아무 것도 얻을 수 없기 때문입니다. 오류 및 완벽하게 조명 된 장면.
벡터를 정규화하는 것이 본질적으로 내 오류가 발생하는 곳에서 내 자신의 정규화 기능을 만들려고했습니다. (- PixelPosition LightPosition)와 "규범"과 같다 -
나는 놈이 전화를 내가 기술적으로 내가 여전히 pixelshader 내부 SQRT을하기 위해 노력하고있어 생각하기 때문에

float3 Norm(float3 v) 
{ 
    return v/sqrt(dot(v, v)); 
} 

난 여전히 오류가 발생합니다. 오류가 특정 아무것도하지

, 그냥 내가 사용하기 때문에 나는 C#에서 내 .FX 파일을로드 라인의 "응용 프로그램 오류"
나는 그것이 실제로 컴파일 오류 일 수 있습니다 생각하고 말한다 (1.1 및 PS 1.4 대) 등의 이전 버전
는 "픽셀 쉐이더 명령어 세트에 명령을 매핑 할 수 없습니다"나에게 말한다는 fxc.exe 사용하여 디버깅 할 때

+0

어떤 오류가 발생하고 있습니까? – ssube

+0

무엇이 오류입니까? 픽셀 또는 버텍스 셰이더에 있습니까? GPU가 10 년이고 1.1 만 지원합니까? 나는이 오래된 플랫폼이 매우 많이 테스트 될 것이라고 생각하지 않기 때문에 컴파일러 오류 일 수 있습니다. –

+0

그것의 모든 비트는 여기에서 찾을 수 있습니다 http://www.riemers.net/eng/Tutorials/DirectX/Csharp/Series3/The_first_light.php 제 GPU가 10 년이라고 생각하지 않지만 DevCaps를 체크인했습니다. VertexShaderVersion 그리고 나에게 1.1을 제공합니다. 오류에 관해서는, 그것은 pixelshader int이고 나는로드하는 곳에서 에러를 내게줍니다.fx 파일 (C#에서) – Frobot

답변

1

올드 GPU : S는 항상, 특히에서 어떤 명령어를 지원하지 않았다 픽셀 쉐이더.

버텍스 쉐이더에서 sqrt를 제거 할 수 있지만 너무 오래된 버전 (1.1 !!)에서는 프래그먼트 셰이더가 극히 제한 될 수 있습니다.

예. 이것은 버그가 아닐 수도 있습니다.

해결 방법은 hlsl을 건너 뛰고 자신 만의 어셈블러를 작성할 수 있습니다 (하지만 같은 문제가 발생했을 수 있습니다). sqrt를 시뮬레이트합니다 (질감 참조 및/또는 보간법을 사용하여 2 개의 텍스처를 가질 수 있음). 1.0 :-p)

물론 sqllt-lookup/interpolation을 hlsl에 쓰려고 할 수도 있지만 너무 큽니다 (IIRC 1.1은 매우 긴 셰이더를 쓰지 못하게합니다) .

+0

좀 더 연구를 한 후에 그냥 믿지 않습니다. 지원. 이전 버전에서는 픽셀 쉐이더가 거의 쓸모가 없었기 때문에 믿기가 어려웠습니다. – Frobot

+0

+1 감사합니다 :-) (BTW, 적어도 2.0 또는 3.0을 수락하는 GPU는 당신이 당신을 변경할 수 있다면 정말 싸게해야합니다.) – Valmond