请考虑以下来自此OpenGL ES for iOS Book的引用:
OpenGL ES支持几种不同的采样模式:考虑当三角形产生的碎片数量少于绑定纹理中可用的纹素数量时会发生什么。只要具有大量纹素的纹理被映射到仅覆盖帧缓冲区中的几个像素的三角形,就会发生这种情况。相反的情况也可能发生。包含少量纹素的纹理可能会映射到在帧缓冲区中产生许多片段的三角形。
这句话:
使用值GL_LINEAR指定参数GL_TEXTURE_MIN_FILTER [glTexParameteri]告诉OpenGLES每当有多个纹素对应一个片段时,从几个合适的纹素中采样颜色并使用线性插值混合颜色以产生纹理对于分段。生成的片段颜色最终可能是纹理中不存在的颜色。例如,如果纹理由交替的黑色和白色纹素组成,则线性采样将混合纹素颜色,片段最终将变为灰色。
我的问题是如何确定图像中有多少纹素以及这些纹素有多大。如果我没错误1 texel!= 1像素,那么你无法通过计算像素来确定纹素的数量。例如,第二个引用描述了具有交替的黑色和白色纹素的图像。你怎么知道你的图像是由黑白纹素组成的......谁定义了纹素大小?谁说一个纹素没有黑色和白色。考虑到纹素没有设置大小,边界等,我怎样才能确定给定图像中的一个纹素是什么样的?
答案 0 :(得分:0)
当纹理大于或小于您要绘制的表面时,纹理像素可能由图像上的许多像素组成。即使图像被旋转或翻译,它也可能发生相同的情况。在空闲情况下,当将纹理/图像绘制到帧缓冲区时,片段将请求图像上的特定像素并呈现它,但在大多数情况下,存在片段请求像素之间的位置处的像素(放大)或对应的位置纹理上的一组像素(缩小)。在任何情况下,您需要使用ether插值颜色值GL_LINEAR
或取最近的像素GL_NEAREST
,而openGL可以很好地完成此操作。
因此,“如何确定图像中有多少纹素以及这些纹素有多大”的问题无法回答,因为您要问的情况取决于您将如何绘制它。
“你怎么知道你的图像是否由黑白素材组成”是看着它不是一个选项,还是我不明白这个问题?你发布的引用假设情况有黑白图像:让我们说它是2x2,2黑色(.0)和2白色(1.0)像素,如果你用GL_LINEAR将它绘制到缓冲区1x1你会得到一个像素灰色(.5),因此帧缓冲区中的像素包含原始图像上不存在的颜色。
“谁定义了纹理像素大小”我不太确定说texel大小但是只是将其转换为“谁定义将使用多少纹理像素来构成帧缓冲区像素”,那么openGL应该是答案因为它构建了如何处理这种情况。
“谁说一个纹素不具有黑色和白色”这实际上是矩阵设置,图像本身,开发人员的组合......你可以把GL_NEAREST,它总是以太一或者另一个但不是两个,在任何其他情况下,你可以尝试计算结果或制作黑白图像并查看输出。
“考虑到纹素没有设置大小,边界等,我怎样才能确定给定图像中的一个纹素是什么样的?”你可以从纹理尺寸和你要绘制的表面的比例中得到一个基本的想法;从输出;一步一步地了解openGL的作用并尝试计算它。
总结一下,所有这些在后台工作的重要性并不是那么重要,只要知道这件事确实发生了。为什么你应该知道它是例如尝试绘制一些明文并在某个方向上将其转换为一半像素,结果将是文本的烦恼(一个非常常见的问题),因为帧缓冲像素将具有“混合”颜色在字母边框上。另一个问题可能是,当结果根本不是要有颜色而是后期处理的一些值,例如一些表查找值,正常变形,坐标变形......在这些情况下,你可能得到根本没有意义的值