gpt4 book ai didi

rounding - HLSL tex2d 采样器似乎使用了不一致的舍入;为什么?

转载 作者:行者123 更新时间:2023-12-02 00:40:47 25 4
gpt4 key购买 nike

我的代码需要根据对象的位置以不同方式呈现对象区域。我正在尝试使用颜色图来定义这些区域。

问题是当我从我的颜色图中采样时,我遇到了碰撞。即,colourmap 中具有不同颜色的两个区域从采样器获得相同的返回值。

我已经尝试了各种格式的彩色 map 。在每种情况下,我将每个区域的颜色设置为“5”;

  • 索引颜色
  • RGB、RGBA:区域 1 将具有 RGB 5%、5%、5%。区域 2 将具有 RGB 10%、10%、10% 等。
  • HSV 灰度:区域 1 的 HSV 为 0,0,5%。区域 2 将有 HSV 0,0,10% 等等。

(在 The Gimp 中选择的值)

tex2D 采样器返回值 [0..1]。

[ 然后我打算从区域派生一个 int 数组索引。与此相关的代码无关,因此已从问题中删除]

float region = tex2D(gColourmapSampler,In.UV).x;

对“5%”颜色进行采样得到 hlsl 中 0.05098 的“区域”。由此我假设 5% 表示 5/100*255,即 12.75,存储在纹理中时四舍五入为 13。 (推理:0.05098 * 255 ~= 13)

按照这个逻辑,50% 应该存储为 127.5。
采样后,我得到 0.50196,这意味着它存储为 128。

70% 应存储为 178.5。
采样后,我得到 0.698039,这意味着它被存储为 178。

这里发生了什么舍入
(127.5 变成 128,178.5 变成 178?!)

编辑:好的, http://en.wikipedia.org/wiki/Bankers_rounding#Round_half_to_even显然这是“银行家的四舍五入”。我不知道为什么要使用它,但它解决了我的问题。显然,这是一个 Gimp 问题。


我正在使用 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;
};

最佳答案

我从没用过 HLSL,但前一阵子我确实用过 GLSL(我必须承认它在我的脑海中非常遥远)。

我遇到的一个纹理问题是 0 不是第一个像素。 1不是第二个。 0 是纹理的边缘,1 是第一个像素的右边缘。这些值会自动进行插值,如果您需要的是精度,就像应用查找表而不是应用普通纹理时,这可能会导致严重的问题。您需要瞄准像素的中间,因此要求 [0.5,0.5]、[1.5,0.5] 而不是 [0,0]、[1, 0] 等。

至少,在 GLSL 中是这样的。

关于rounding - HLSL tex2d 采样器似乎使用了不一致的舍入;为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2653627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com