위치에 따라 객체의 영역을 다르게 렌더링해야하는 코드가 있습니다. 이 영역을 정의하기 위해 컬러 맵을 사용하려고합니다.HLSL tex2d sampler가 겉으로보기에는 일관성없는 반올림을 사용하고 있습니다. 왜?
문제는 내 컬러 맵에서 샘플링 할 때 충돌이 발생합니다. 즉, 컬러 맵에서 다른 색상의 두 영역은 샘플러에서 반환 된 동일한 값을 얻습니다.
다양한 색상 맵을 시도했습니다. 나는 각 경우에 "5"가되도록 각 영역의 색을 설정합니다.
- 인덱스 컬러
- RGB, RGBA : RGB 영역 (1) 5 %, 5 %, 5 %의 것이다. 영역 2에는 RGB 10 %, 10 %, 10 % 등이 있습니다.
- HSV 그레이 스케일 : 영역 1의 HSV는 0.5 %입니다. 영역 2는 HSV 0,0,10 % 등을 갖습니다.
(김프에서 선택된 값)
가 tex2D 샘플러가 값 [0..1]를 반환한다.
[지역에서 int 배열 색인을 파생하고자합니다. 그와 함께 할 수있는 코드는 그래서 "5 %"색상을 샘플링
float region = tex2D(gColourmapSampler,In.UV).x;
는 HLSL에서 0.05098의 "지역을"준] 질문에서 제거 된, 관련이 없습니다. 이 5 %는 5/100 * 255 또는 12.75를 나타내며 텍스처에 저장 될 때 13으로 반올림된다고 가정합니다. (추론 : 0.05098 * 255 ~ = 13)
이 논리에 따르면 50 %는 127.5로 저장해야합니다.
샘플링 한 결과, 이는 0.50196이되어 128로 저장되었음을 의미합니다.
70 %를 178.5로 저장해야합니다.
여기 무슨 일 라운딩이
178로 저장 한 의미있는 나는 0.698039 수, 샘플링?
(127.5 128이되고, 178.5이된다 178?!)
편집 : OK, http://en.wikipedia.org/wiki/Bankers_rounding#Round_half_to_even 은 분명히이 "은행의 반올림"입니다. 왜 이것이 사용되는지는 모르지만 내 문제는 해결됩니다. 분명히 그것은 김프 문제입니다.
저는 Shader Model 2와 FX Composer를 사용하고 있습니다. 이것은 내 샘플러 선언입니다.
//Colour map
texture gColourmapTexture <
string ResourceName = "Globe_Colourmap_Regions_Greyscale.png";
string ResourceType = "2D";
>;
sampler2D gColourmapSampler : register(s1) = sampler_state {
Texture = <gColourmapTexture>;
#if DIRECT3D_VERSION >= 0xa00
Filter = MIN_MAG_MIP_LINEAR;
#else /* DIRECT3D_VERSION < 0xa00 */
MinFilter = Linear;
MipFilter = Linear;
MagFilter = Linear;
#endif /* DIRECT3D_VERSION */
AddressU = Clamp;
AddressV = Clamp;
};
이미지 편집기에서 반올림이 발생합니다. 8b 텍스처는 정수 이외의 것을 표현할 수 없습니다. 텍스처에 178.5를 저장할 수 없으므로 178 또는 179를 저장해야합니다 (178/255 또는 179/255). 셰이더는 정수에 반올림을 사용하지 않습니다. 정확도를 높이기 위해 반올림하면 여기에 도달하지 않을 것입니다. – Suma
하하 (Haha, ofc). 김프가 텍스처의 값을 저장하는 방법과 관련이 있어야합니다. HLSL과 아무런 관련이 없습니다 : \ – RJFalconer