2013-05-29 34 views
1

考虑从这个的OpenGL ES为iOS簿下面引用确定像素纹理数:在片段

的OpenGL ES支持几种不同的采样模式:考虑当较少的片段为一个三角形比纹理像素的数目产生会发生什么在绑定的纹理中可用。只要具有大量纹理元素的纹理映射到只覆盖帧缓冲区中几个像素的三角形,就会发生这种情况。相反的情况也可能发生。包含少量纹理元素的纹理可能映射到在帧缓冲区中产生许多片段的三角形。

而这个报价:

指定参数GL_TEXTURE_MIN_FILTER [glTexParameteri]与值GL_LINEAR告诉OpenGLES,每当有多个纹理像素对应于一个片段,样品的颜色从几个合适的纹理像素的和使用线性插值混合颜色以产生纹理对片段的贡献。产生的片段颜色可能最终成为纹理中不存在的颜色。例如,如果纹理由交替的黑色和白色纹理元素组成,则线性采样将混合纹理元素颜色,并且片段最终变为灰色。

我的问题是如何确定图像中有多少个纹​​理元素以及这些纹理元素有多大。如果我没有错误1 texel!= 1像素,那么您无法通过计算像素来确定像素的数量。例如,第二个引用描述了具有交替黑白纹理像素的图像。你怎么知道你的图像是由黑白纹理元素组成的......谁定义了纹理元素的大小?谁说一个texel没有黑色白色。考虑到纹理像素没有设置大小,边界等,我怎样才能确定给定图像中的一个纹理像素是什么样子的。

回答

0

当纹理大于或小于您要绘制的表面时,可能会构成纹理从图像上的许多像素。即使图像旋转或翻译,也可能发生相同的情况。在空闲情况下,当将纹理/图像绘制到帧缓冲区时,片段将请求图像上的特定像素并呈现它,但是在大多数情况下,存在片段请求位于像素之间的位置处的像素(放大倍数)到纹理上的一组像素(缩小)。在任何情况下,您都需要使用以太内插来获取颜色值GL_LINEAR或取最接近的像素GL_NEAREST,而openGL可以很好地完成此操作。因此,“你如何确定图像中有多少纹理元素,以及这些纹理元素有多大”这个问题无法回答,因为你所要求的情况取决于你将如何绘制它。

“你怎么知道你的图像是由黑色和白色的纹理元素组成的?”它看起来不是一种选择,还是我不明白这个问题?你发布的报价提出了一个假想的情况,有黑白图像:可以说它是2x2,2黑色(.0)和2白色(1.0)像素,如果你用GL_LINEAR将它绘制到缓冲区1x1,你会得到一个像素灰色(.5),因此帧缓冲区中的像素包含原始图像中不存在的颜色。

“谁定义了纹理元素的大小”我不太确定是否要说纹理元素的大小,但可以将其转换为“谁定义了将使用多少纹理像素来组成帧缓冲区像素”,那么openGL应该是因为它是建立在如何处理这种情况的基础上的。 “这是谁的说一个texel没有黑色和白色在它”这实际上是矩阵设置,图像本身,开发人员的组合...您可以放置​​GL_NEAREST,并且在任何其他情况下,您可以尝试计算结果或制作黑白图像并查看输出结果,它将始终为醚或不是两者。

“考虑到texels没有设置大小,边界等,我怎么才能确定给定图像中的一个纹理像素是什么样的。”你可以从纹理尺寸和表面绘制的比例中获得一个基本想法;来自输出;逐步了解openGL的功能并尝试对其进行计算。

总而言之,如果所有这些都在后台工作,就像知道这些事情确实发生一样,这并不重要。为什么你应该知道它是尝试绘制一些明确的文本,并在某个方向翻译它的一半像素,结果将是文本的模糊(一个非常常见的问题),因为帧缓冲区像素将“混合”的颜色在字母边界上。另一个问题可能是结果不是完全意味着颜色,而是一些后处理的值,例如某些表格查找值,正常变形,坐标变形......在这些情况下,您可能会得到完全没有意义的值。

+0

我的意思是黑+白纹理图像是这样的:如果1纹素!= 1像素和纹素没有定义边界,谁知道一个纹素结束而另一个开始?以你描述的2X2图像为例,我知道会有2个黑色像素和2个白色像素..所以有多少个像素?如果一个texel!=一个像素,我将如何确定纹素的数量?可能有两个纹理元素,每个纹理元素包含相同的颜色,或者可能有4个元素包含它们自己的像素。 - 真的任何组合我是完全错误的像素如何对应像素谢谢:) – foobar5512

+0

此外,texels必须由相同的彩色像素组成,例如一个纹理像素可以包含1个白色像素和1个黑色像素? – foobar5512

+0

您可以说要绘制的纹理元素的数量与片段数(或输出像素数)相同。帧缓冲区的片段将从纹理中调用纹理元素,所以您不能谈论只有纹理或只有缓冲区的纹理元素,您需要关联它们。纹理也不能开始和结束,它们可以重叠,甚至可以相同:绘制到2x2缓冲区的1像素纹理将调用4个纹素,它们将全部相同。而且一个纹理元素可以由多种颜色组成,因此黑色和白色纹理就是灰色。 –