基于OpenGL的图标绘制

基于OpenGL的图标绘制,opengl,graphics,icons,textures,Opengl,Graphics,Icons,Textures,我想使用OpenGL为UI呈现RGBA图标。首先,我使用gimp将图标缩放为2的幂。然后,我使用lodepng加载图标,然后使用OpenGL图标纹理使用GL_LINEAR和GL_LINEAR_MIPMAP_LINEAR渲染它。图标已渲染,但看起来模糊 我想这是因为像素拟合不好。然而,我不知道我能做什么 编辑:使用high16x MSAA可以解决问题,但性能损失太大 Edit2:我正在使用这个着色器对图标纹理进行采样 #version 140 noperspective in vec2 pos;

我想使用OpenGL为UI呈现RGBA图标。首先,我使用gimp将图标缩放为2的幂。然后,我使用lodepng加载图标,然后使用OpenGL图标纹理使用GL_LINEAR和GL_LINEAR_MIPMAP_LINEAR渲染它。图标已渲染,但看起来模糊

我想这是因为像素拟合不好。然而,我不知道我能做什么

编辑:使用high16x MSAA可以解决问题,但性能损失太大

Edit2:我正在使用这个着色器对图标纹理进行采样

#version 140
noperspective in vec2 pos;

uniform sampler2D tex;

out vec4 colorOut;


void main(void){
    vec4 v=texture(tex, (pos/2)+vec2(0.5));
    colorOut=vec4(v);
}

Andon M.Coleman的解决方案很有效,而且非常简单,但我想在运行时将图标缩放到适当的大小

我的解决方案是每像素提取几个8x8 texel,这对于实时应用程序来说太慢了,但由于图标大小不会改变,因此可以将结果缓存到另一个纹理上。然后,我只需要获取每个像素的样本


结果没有Andon M.Coleman解决方案那么清晰,但看起来很不错。

极高的MSAA可能并不能解决这一问题-MSAA不会增加纹理采样的次数或每像素运行片段着色器的次数,但它可能会改变采样的位置。你可以先尝试一些非常简单的方法,比如恒定的半像素偏移量。我知道MSAA不是解决方案。但是,使用一个恒定的偏移量是行不通的。你在那里展示的+vec20.5不是半像素偏移量,而是半纹理偏移量。要偏移半个像素的纹理,技术上你需要知道纹理的尺寸+vec20.5/textureSizetex,0.xy应该可以做到。1。不要缩放纹理,只需将其归零至2的幂次方,但只使用纹理中已使用的空间。2.使用与纹理使用区域相同的渲染图标大小[像素]@Andon M.Coleman我知道这一点。我试过了,但没用: