gpt4 book ai didi

opengl-es-2.0 - opengl纹理映射偏离5-8像素

转载 作者:行者123 更新时间:2023-12-04 07:40:40 24 4
gpt4 key购买 nike

我在纹理贴图/精灵表中一堆紧挨着缩略图/图标。从像素到像素的关系,这些像素正从145像素平方扩大到238屏幕像素平方。我希望访问纹理坐标时框的边缘上的精度为+ -1或2像素,因此我还在缩略图的顶部绘制了4像素的轮廓以隐藏此可能的伪像。但是我看到了准确性的巨大差异。有时它朝一个方向移动,有时朝另一个方向移动。

我检查了数学,不知道发生了什么。

缩略图将放大约1.64倍。因此,源纹理坐标中的单个像素偏移可能会导致屏幕上的像素偏移约2个像素。顶部的4像素白框以1-1像素的比例绘制关系,并且应该在框的边缘的任一侧覆盖约2像素。那部分正在工作。在这里,我关闭了边框以显示纹理坐标的距离...。



我可以手动调整数字以使其消失。但是我必须将纹理坐标的宽度/高度缩小几个源像素,并且在某些情况下,要向起点添加(或减去)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个Tris的三角形带的盒子。
没关系,但是应用于模型的矩阵没有进行任何缩放。该框用于屏幕缩放。缩放仅在提供的纹理坐标中发生。
如上所示,对象的纹理坐标为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的宽度证明效果更好。但是我可以通过手动调整数字来解决所有问题。我想掌握数学以使其正确执行。

...或..也许与最小/磁力过滤有关-尽管我阅读了这些内容,在这种情况下我正在做的事情似乎是正确的。

最佳答案

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

实际上,这很简单。

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


纹理坐标的精度。通过指定mediap,它就可以自行修复。我怀疑这也将有助于解决我在此问题中遇到的问题:

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

一旦这样做,我就必须回到原来的145宽度(这似乎仍然不对,但是很好)。值得的是,我最后回到所有纹理坐标上的所有原始数学知识。 “像素中心”方法显示的相邻像素多于直线/ 2048。

关于opengl-es-2.0 - opengl纹理映射偏离5-8像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19022441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com