1

考虑下面这本 OpenGL ES for iOS Book 的引用:

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

而这句话:

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

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

4

1 回答 1

0

当纹理大于或小于您要绘制的表面时,纹素可能由图像上的许多像素组成。即使图像被旋转或平移,它也可能发生相同的情况。在空闲情况下,当将纹理/图像绘制到帧缓冲区时,片段将请求图像上的特定像素并呈现它,但在大多数情况下,片段会请求像素之间的像素(放大)或对应的位置到纹理上的一组像素(缩小)。在任何情况下,您都需要以太网插值颜色值GL_LINEAR或获取最近的像素GL_NEAREST,openGL 可以很好地做到这一点。

因此,无法回答“如何确定图像中有多少纹素以及这些纹素有多大”的问题,因为您要问的情况取决于您将如何绘制它。

“你怎么知道你的图像是否由黑白纹素组成”是不是一种选择,或者我没有理解这个问题?您发布的引文提出了一个具有黑白图像的假设情况:假设它是 2x2、2 个黑色(.0)和 2 个白色(1.0)像素,如果您使用 GL_LINEAR 将其绘制到 1x1 缓冲区,您将获得一个像素使用灰色 (.5),因此帧缓冲区中的像素包含原始图像上不存在的颜色。

“谁定义了 texel 大小”我不太确定说 texel 大小,但让我们将其转换为“谁定义将使用多少纹理像素来组成帧缓冲区像素”,那么 openGL 应该是答案建立如何处理这种情况。

“谁说一个纹素中没有黑色和白色”这实际上是矩阵设置、图像本身、开发人员的组合......你可以把 GL_NEAREST 放在一个或另一个但不是两者,在任何其他情况下,您都可以尝试计算结果或制作黑白图像并查看输出。

“考虑到纹素没有固定的大小、边界等,我怎么可能确定给定图像中的一个纹素是什么样的?” 你可以从你要绘制的纹理大小和表面的比例中得到一个基本的想法;从输出;逐步了解 openGL 所做的工作并尝试计算它。

总而言之,这一切在后台如何运作并不重要,而只是知道这些事情确实发生了。例如,为什么你应该知道它是尝试绘制一些清晰的文本并在某个方向将其翻译一半像素,结果将是文本的繁琐(一个非常常见的问题),因为帧缓冲区像素将具有“混合”颜色在字母边框上。另一个问题可能是当结果根本不是颜色而是一些用于后期处理的值时,例如一些表查找值、法线变形、坐标变形......在这些情况下,您可能会得到根本没有意义的值.

于 2013-05-30T13:25:29.717 回答