我正在制作基于libGDX的游戏,并且我尝试制作像素化着色器。对我来说,它看起来应该有效,但它并没有。我只是在屏幕上看到1种颜色的纹理。目标是将详细纹理转换为像素化纹理。 这是我的片段着色器的代码:
precision mediump float;
varying vec4 v_color;
varying vec2 v_texCoord0;
uniform sampler2D u_sampler2D;
void main(){
ivec2 texSize = textureSize( u_sampler2D, 0);
vec4 color = texture2D(u_sampler2D, vec2(int(v_texCoord0.x * texSize.x) / texSize.x, int(v_texCoord0.y * texSize.y) / texSize.y)) * v_color;
gl_FragColor = color;
}
我在这里要做的是:我得到纹理的大小。然后,按照这个尺寸,我会像素化一样。 v_texCoord0并获取该像素的颜色。
我删除
中的int castint(v_texCoord0.x * texSize.x) / texSize.x, int(v_texCoord0.y * texSize.y)
,我看到纹理正常,否则我会看到我在本文开头所描述的内容。但是,对我来说,我的代码中的任何内容都可能是错误的。
我希望有经验的人可以帮我解决这个问题!
答案 0 :(得分:2)
你在这里进行整数除法:
not exists
结果只能是一个整数,并且如果select b.*
from b
where not exists (select 1
from a
where a.vehicle_id = b.id and a.user_id = @a_user_id
);
在[0,1]范围内,那么除了纹理的最右边部分之外,它将导致生成零,当片段在边界处显示采样时你的纹理。
你应该应用浮点数学来获得你想要的效果:
ivec2 texSize;
[...] int(v_texCoord0.x * texSize.x) / texSize.x
(另请注意,无需单独使用v_texCoord0.x
和vec2 texSize=vec2(textureSize( u_sampler2D, 0));
vec4 color = texture2D(u_sampler2D, floor(v_texCoord0 * texSize) / texSize);
组件,您可以使用向量操作。)
但你在这里所做的并不完全清楚。在某种程度上,您正在模仿x
过滤可以免费为您做的事情(只是您的选择被移动了半个纹素),所以问题是:你从中获得了什么。如果使用y
过滤,则上面的公式将始终在纹素角处进行采样,以便线性过滤器将导致平均2x2纹素区块的颜色。如果你使用GL_NEAREST
,公式将不会给你比以前更多的像素化,它只是以一种奇怪的方式移动纹理。如果你使用一些带有mipmapping的滤镜,由于方程的非连续性,公式将完全打破mipmap选择(这也会导致GL无法以可靠的方式辨别纹理缩小或放大,所以它不会破坏mipmapping)。