opengl纹理映射5-8像素

时间:2013-09-26 07:55:01

标签: opengl-es-2.0 glsl texture-mapping

我在纹理贴图/精灵表中有一堆缩略图/图标紧挨着包装。从像素到像素的关系,它们从145像素的正方形放大到238像素的正方形。当访问纹理坐标时,我期望在框的边缘获得+ -1或2像素精度,所以我还绘制了缩略图顶部的4像素轮廓以隐藏这个可能的工件。但我看到准确性差异很大。有时它会向一个方向移动,有时则是另一个方向。

我已经检查了数学,但我无法弄清楚发生了什么。

缩略图正在扩大约1.64倍。因此,源纹理坐标中的单个像素关闭可能导致屏幕上关闭约2个像素。顶部的4像素白色框架以1-1像素到片段关系绘制,并且应该覆盖盒子边缘两侧的大约2个像素。那部分是有效的。在这里,我关闭了边框,以显示纹理坐标的距离....

enter image description here

我可以手动调整数字以使其消失。但我必须将纹理坐标宽度/高度缩小几个源像素,并在某些情况下将5或6个像素添加(或减去)到起始点。我真的只想要数学计算或弄清楚我在这里做错了什么。这种东西让我疯了!

要知道一堆废话。

  • 着色器在顶点着色器中进行纹理坐标偏移...

    v_fragmentTexCoord0 = vec2((a_vertexTexCoord0.x * u_texScale) + u_texOffset.s, (a_vertexTexCoord0.y * u_texScale) + u_texOffset.t);
    gl_Position = u_modelViewProjectionMatrix * vec4(a_vertexPosition,1.0);
    
  • 此对象是一个带有2个三元组的三角形条带。

  • 并非它应该重要,但应用于模型的矩阵没有进行任何缩放。该框用于屏幕缩放。缩放仅在正在提供的纹理坐标中发生。

  • 如上所示,对象的纹理坐标为0.00 - 0.07,然后在着色器中添加了每个缩略图不同的偏移量。 2048年的.07就像是143.原来我在.0708得到它应该更接近145它更糟糕并且显示更像是纹理的148像素。为了让它只显示145个源像素,我必须将其设为.0.06835,即140像素。

  • 我已经尝试在计算器中进行数学运算并直接输入数字。我也试过做= 1305/2048。这些将进入GLfloats而不是双倍。

  • 此纹理贴图图像为PNG,并加载了以下设置:

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
    

但我也尝试过GL_LINEAR没有明显区别。

  • 我没有对其他纹理(在同一纹理贴图中)有任何准确性问题,我没有进行纹理缩放。

  • 当坐标越来越高时,它不会越走越远。在上面的图像中,NEG MAP拇指位于HEAT MAP拇指旁边,在不同方向关闭但在接缝处正确。

  • 这是这两个的偏移数据..

    filterTypes[FT_gradientMap20].thumbTexOffsetS = 0.63720703125;
    filterTypes[FT_gradientMap20].thumbTexOffsetT = 0.1416015625;
    filterTypes[FT_gradientMap21].thumbTexOffsetS = 0.7080078125;
    filterTypes[FT_gradientMap21].thumbTexOffsetT = 0.1416015625;
    

====更新====

有些事情我发现我做错了并在这里进行了讨论:OpenGL Texture Coordinates in Pixel Space

单个缩略图的宽度为145.但是这将是0-144,其中145开始下一个。我使用的是145的宽度,因此它将是1像素太大。使用上面的像素类型数学中心,我们实际应该从0的中心到144的中心.144.5 - 0.5 = 144。

使用他的公式(2i + 1)/(2N)我为每个起点创建了新的偏移量,并使用144/2048作为宽度。这使事情变得更好,但仍然在一些地区。有时和其他时间仍然在一个方向上。虽然每个x或y位置都是一致的。

使用143的宽度证明了更好的结果。但我可以通过手动调整数字来解决所有问题。我想让数学运算正确。

...或..也许它与min / mag过滤有关 - 虽然我读到了这一点,而我正在做的事情似乎适合这种情况。

1 个答案:

答案 0 :(得分:3)

经过大量的实验并且必须创建一个网格衬里的引导纹理,这样我才能看到每个纹理到底有多远......我终于明白了!

实际上非常简单。

uniform mat4 u_modelViewProjectionMatrix;
uniform mediump vec2 u_texOffset;
uniform mediump float u_texScale;
attribute vec3 a_vertexPosition;
attribute mediump vec2 a_vertexTexCoord0;

纹理坐标的精度。通过指定mediump,它只是修复了自己。我怀疑这也有助于解决我在这个问题中遇到的问题:

Why is a texture coordinate of 1.0 getting beyond the edge of the texture?

一旦我这样做了,我不得不回到我原来的145宽度(这似乎仍然是错误的但是很好)。为了它的价值,我结束了所有纹理坐标的所有原始数学。 “像素中心”方法显示了比直/ 2048更多的相邻像素。

enter image description here