2013-02-12 5 views
1

실제 코드를 탐색하는 데 필요한 모든 노력을 덜어주기 위해 가장 간단한 형식으로 문제를 줄이려고 노력했습니다. HLSL에서 제공하는 도트 함수를 사용하는 동안 예상 된 결과를 얻을 수 없습니다. 이 예제에서는 두 벡터의 내적이 26이 될 것으로 예상합니다.이 코드를 실행하면 항상 45가 반환됩니다.이 함수를 픽셀 쉐이더 내에 배치하고 쉐이더 모델 2를 사용하여 컴파일하고 있습니다! !! !!예기치 않은 결과를 반환하는 HLSL Dot 제품

문제는 당신이 당신의 float3 년대를 정의하고있는 방법입니다

플로트() {

float3 vectorOne = (1.0, 2.0, 3.0); 
float3 vectorTwo = (3.0, 4.0, 5.0); 
float dotResult = dot(vectorOne, vectorTwo); 
//Expected dotResult: 26 
//Actual dotResult 45 
return dotResult; 

}

+0

당신이 float3 vectorOne = float3 (1.0F, 2.0f, 3.0F) '로 변경 할 수; float3 vectorTwo = float3 (3.0f, 4.0f, 5.0f); 그리고 시도해보십시오. 나는이 벡터가없는 과제를 본 적이 없다. "생성자", 아마도 도움이 될 것이다. :) – Gnietschow

+0

나는이 문제를 몇 개의 포럼에 게시했다. 나는 이렇게 벡터를 생성해야한다는 것을 발견했다 : float3 vectorOne = {1.0, 2.0, 3.0}; 이것은 내 문제를 해결했다. 희망이 게시물은 다른 사람을 도울 수 있습니다. –

답변

2

다음 또 다른 포럼에서입니다 MyDotProblemSimplified.

그 할당하는 (나는() 표기가하는 정확히 모르겠어요

float3 vectorOne = (1.0, 2.0, 3.0); 
float3 vectorTwo = (3.0, 4.0, 5.0); 

float3 vectorOne = {1.0, 2.0, 3.0}; 
float3 vectorTwo = {3.0, 4.0, 5.0}; 

로 교체, 그러나 당신의 셋의 마지막 값을 평가하기 위해 나타납니다 벡터의 모든 구성 요소에 대한 값).

+0

또는 float3 vectorOne = float3 (1.0, 2.0, 3.0); 명시 적 – bjorke

0

(1.0, 2.0, 3.0)- 특정 표기법이 아닙니다. 대신, comma operator을 사용하는 스칼라 표현식입니다. 처럼 표현식은 왼쪽에서 오른쪽으로 평가되며,이 경우 값은 3.0입니다.이 값은 모든 채널에 해당 값을 복제하는 단일 스칼라 값에서 float3을 구성하는 데 사용됩니다.

이 원하는 결과를 달성하기 위해, 옵션은 다음과 같습니다

// option 1: 
float3 v = float3(x,y,z); 

// option 2: 
float3 v = {x,y,z}; 

// option 3: 
float3 v; 
v.x = x; 
v.y = y; 
v.z = z; 
관련 문제