【问题标题】:Icon rendering on OpenGLOpenGL上的图标渲染
【发布时间】:2015-02-15 00:14:28
【问题描述】:

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

我猜这是由于像素拟合不良造成的。但是,我不知道该怎么办。

编辑:使用高 (16x) 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);
}

【问题讨论】:

  • 极高的 MSAA 可能不是解决此问题的原因 - MSAA 不会增加对纹理进行采样或按像素运行片段着色器的次数,但它可能会更改采样的位置在。您可以先尝试一些非常简单的方法,例如恒定的半像素偏移。
  • 我知道 MSAA 不是解决方案。但是,使用恒定偏移量是行不通的。
  • 您在此处显示的 (+vec2(0.5)) 不是半像素偏移,而是半纹理偏移。要偏移半个像素(技术上的纹素),您需要知道纹理的尺寸。 +vec2(0.5)/textureSize(tex, 0).xy 应该这样做。
  • 1.不要缩放纹理,只需将其零填充到 2 的幂,但仅使用其中已使用的空间。 2.使用渲染的图标大小[像素]与纹理的使用区域相同
  • @Andon M. Coleman 我知道。我试了一下,还是不行:(

标签: opengl graphics icons textures


【解决方案1】:

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

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

结果不如 Andon M. Coleman 解决方案清晰,但看起来相当不错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多