【发布时间】:2018-12-13 22:49:13
【问题描述】:
我试图在整数像素坐标之间而不是在 0-1 之间进行插值,因为我使用的是点采样,所以我对像素的分数不感兴趣,但纹理坐标仍会进入像素着色器即使数据类型为 int2,也为 float2。
pixelSize 是 1 除以纹理大小
matrix WorldViewProjection;
float2 pixelSize;
Texture2D SpriteTexture;
sampler2D SpriteTextureSampler = sampler_state
{
Texture = <SpriteTexture>;
AddressU = clamp;
AddressV = clamp;
magfilter = POINT;
minfilter = POINT;
mipfilter = POINT;
};
struct VertexShaderOutput
{
float4 Position : SV_POSITION;
float4 Color : COLOR0;
int2 TextureCoordinates : TEXCOORD0;
};
VertexShaderOutput SpriteVertexShader(float4 position : POSITION0, float4 color : COLOR0, float2 texCoord : TEXCOORD0)
{
VertexShaderOutput output;
output.Position = mul(position, WorldViewProjection);
output.Color = color;
output.TextureCoordinates = texCoord * (1 / pixelSize);
return output;
}
float4 SpritePixelShader(VertexShaderOutput input) : COLOR
{
float2 texCoords = input.TextureCoordinates * pixelSize;
return tex2D(SpriteTextureSampler, texCoords) * input.Color;
}
technique SpriteDrawing
{
pass P0
{
VertexShader = compile vs_2_0 SpriteVertexShader();
PixelShader = compile ps_2_0 SpritePixelShader();
}
};
【问题讨论】:
-
如果
pixelSize已经是1除以纹理大小,在计算纹理坐标时不应该再除。所以应该是output.TextureCoordinates = texCoord * pixelSize; -
没有。 1 / 1 / x = x。因此 1 / 1 / 纹理大小 = 纹理大小。我必须再次划分它以获得纹理大小,而不必设置两个变量。将纹理坐标乘以纹理大小可以得到整数纹理坐标。
-
哦,我忽略了像素着色器中的
* pixelSize。我认为您的顶点数据包含整数纹理坐标。你的问题到底是什么?在帖子中是没有问题的,我看不出将 texCoord 转换为整数并返回浮动而不做任何事情的意义。 -
你问转换成整数然后再转换成浮点数的意义何在?你丢失了十进制值,我对像素的分数不感兴趣,正如我在我的问题中所说的那样。因此,与其获取插值纹理坐标,例如:(368.4 * (1 / textureWidth), 175.8 * (1 / textureHeight)),我希望它为 (368, 175)。我的问题是它保留了十进制值,即使它是 int2,所以我把它当作 (368.4, 175.8),这是没有意义的。
-
所以我想向下取整,添加半个像素(为简单起见,我将其排除在外)并转换回 0-1 之间的纹理坐标。这样我总是在每个像素的中心采样。在点采样中,如果您的采样距离像素的边界太近,它将对相邻像素进行采样。