opengl-es - OpenGL中的插值是什么?

标签 opengl-es

我刚刚开始学习OpenGL ES 2.0,在此过程中,我遇到了一些术语,即使有定义,这些术语对我来说都是没有意义的。像这样:插值

从《 OpenGL ES 2.0编程指南》一书中,我看到了插值的以下定义:

The mechanism used to generate a varying value for each fragment from the varying values assigned to each vertex of the primitive is called interpolation.



虽然我了解this answer是什么Linear Interpolation,但以上定义对我而言没有意义。

您会换一种说法,并举例说明什么是插值吗?

最佳答案

至于“换句话说”的一般定义,您可以在网上找到一些。例如,我可以尝试向您解释:

当您有有限数量的数据试图表示无限量的数据时,可以使用插值,例如,您有2个点代表一条线:

对于插值,您始终需要一个表示形式的提示,在直线情况下,您需要2个点(提示是“这是一条线”),可以说它们是向量A和B。现在的解决方案是对于任何实数's'的T(s) = A + s*(B-A)在两个方向上获得无尽的线条。要在A和B之间获得一条线,您需要在间隔[0,1]上定义's',以便T(0)=AT(1)=B成为线性插值。

对于更复杂的插值,您可以看一下openGL:

请注意,与我将在此处编写的内容相比,GL和您的GPU中使用的算法要复杂得多且经过优化,但通常具有相同的结果。

对于形状,通常使用由3个向量定义的三角形(顶点),并说它是三角形(在draw方法中称为“triangles”)。在对这些向量应用一些矩阵之后,您将在绘制缓冲区上获得它们的2d投影(可能在顶点着色器中发生)。现在,您需要使用一些颜色,纹理或颜色插值来填充缓冲区中的所有这些点。首先,所有这些绘制点(实际上它们在缓冲区上的位置)都是线性插值机制的结果(在GL中无法控制)。其次,通常使用线性插值法来填充哪种颜色:

尝试通过设置颜色指针来绘制带有不同颜色顶点的三角形。您将在整个表面上获得一个很好的平滑色彩,这是根据位置的插值对颜色进行线性插值的结果(您可以在片段着色器中为每个需要绘制的像素获得位置插值结果)。您可以像这样手动实现此颜色插值结果:

输入:

Vector a, b, c; //original triangle positions
Vector interpolationABC; //current fragment interpolation between a, b and c
Color colorA, colorB, colorC; //colors for vectors a, b and c

输出(此片段的颜色):
Color output = (
(a - interpolationABC).length() * colorA + 
(b - interpolationABC).length() * colorB + 
(c - interpolationABC).length() * colorC ) 
/ (
(a - interpolationABC).length() + 
(b - interpolationABC).length() + 
(c - interpolationABC).length() );

该机制再次表示线性插值(实际上是一种很慢的插值,但是它可以解决问题,并且可读性很强)

对于非线性插值的示例,您将需要一些想象力:假设我们正在绘制一个球体。为了简单起见,假设它的中心在(0,0,0)中,其半径为1。该球体是用N个三角形创建的,并且由于性能问题,如果N不够大(大多数情况下),则它是一个有点“前卫”,我们希望能使它更平滑一些。因此,我们必须打开一些灯光(这只是一个没有灯光的圆圈),并弄清楚如何设置法线。一方面,您可以计算由3个点定义的曲面的法线,并且每个三角形将具有唯一的法线,但会产生“迪斯科球”效果,另一方面,您知道球体的任何点“P”的法线为normalized(P-center)或本例中的点本身。因此,每个顶点法线都是顶点本身的位置(因此,每个三角形现在有3个不同的法线),每个片段的法线是这些法线的插值:

如果您使用与颜色相同的插值机制,则会看到法线的长度不是“恒定”的,这会导致缺陷,从而迫使您使用其他机制(非线性)。在这种特定情况下,您可以简单地对那些线性片段结果进行归一化并获得所需的结果,但是在这种特定情况下,您可以仅从片段位置计算法线(您可以对数学上可表示的任何形状执行此操作)。但是在实践中知道,您会得到一个奇怪的形状,该形状具有平滑的部分和边缘,并且可能具有不同大小的法线来表示某些令人敬畏的效果,这就是为什么有很好的机制可以在形状上插入不同参数的原因。

同样,内插机制是通过仅知道有限数量的数据而可以产生无限数量结果的机制(这些机制之一称为“线性内插”)。或者换句话说,就是您发布的更具体的示例:

The mechanism used to generate a varying value for each fragment from the varying values assigned to each vertex of the primitive is called interpolation.

关于opengl-es - OpenGL中的插值是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12345622/

相关文章:

android - Opengl-使用着色器,有必要吗?

java - W/OpenGLRenderer : Points are too far apart

iphone - unity 禁用 iphone 4 的视网膜

Android OpenGL图像处理——不带SurfaceView

android - 在 opengl es 2.0 中混合 alpha

ios - 响应 iOS 中的 RAM 可用性

c - 嵌套模板 - OpenGL ES

ios - GPUImage 着色器因 "ERROR: One or more attached shaders not successfully compiled"而崩溃

iphone - 使用 Jeff Lamarches 脚本加载模型

ios - 使用与 OpenGL 版本中相同的代码移动 OpenGL ES 纹理