首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >opengl纹理映射5-8像素

opengl纹理映射5-8像素
EN

Stack Overflow用户
提问于 2013-09-26 07:55:00
回答 1查看 889关注 0票数 3

我有一堆缩略图/图标,就在一个纹理地图/精灵工作表中,彼此相接在一起。从像素到像素之间的关系,这些像素从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);
  • 这个物体是一个盒子,它是一个三角形带,有两个三倍。
  • 这并不重要,但应用于模型的矩阵并没有进行任何缩放。这个盒子是用来屏幕缩放的。缩放只在正在提供的纹理坐标中进行。
  • 上面看到的物体的纹理坐标是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地图上,拇指就在热图拇指旁边,在不同的方向,但在接缝处是正确的。
  • 这是这两个人的偏移数据。 filterTypesFT_gradientMap20.thumbTexOffsetS = 0.63720703125;filterTypesFT_gradientMap20.thumbTexOffsetT = 0.1416015625;filterTypesFT_gradientMap21.thumbTexOffsetS = 0.7080078125;filterTypesFT_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过滤有关--尽管我阅读了这方面的内容,而我所做的似乎对这个案例来说是正确的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-27 06:09:00

经过大量的实验,并不得不创建一个网格线的引导纹理,这样我就可以确切地看到每一个纹理有多远。我终于拿到了!

其实很简单。

代码语言:javascript
运行
复制
uniform mat4 u_modelViewProjectionMatrix;
uniform mediump vec2 u_texOffset;
uniform mediump float u_texScale;
attribute vec3 a_vertexPosition;
attribute mediump vec2 a_vertexTexCoord0;

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

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

一旦我这样做,我必须回到原来的145宽度(这似乎仍然是错误的,但哦,好吧)。至于它的价值,最后,我回到了所有的纹理坐标的原始数学。“像素中心”方法显示的相邻像素比直线/2048显示的要多。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19022441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档