了解这个Haskell图形程序中的TextureBlitter是什么



在私有窗口管理器/合成器Haskell存储库中,我遇到了以下数据类型,我正在尝试理解:

data TextureBlitter = TextureBlitter {
_textureBlitterProgram :: Program,                  -- OpenGL Type
_textureBlitterVertexCoordEntry :: AttribLocation,  -- OpenGL Type
_textureBlitterTextureCoordEntry :: AttribLocation, -- OpenGL Type
_textureBlitterMatrixLocation :: UniformLocation    -- OpenGL Type
} deriving Eq

ProgramAttribLocationUniformLocation的类型都来自这个 OpenGL 库。

问题:我在网上找不到关于"纹理闪光"概念的好信息。因此,我希望具有更多专业知识的人可以立即很好地猜测这种类型(可能)用于什么。

我假设字段_textureBlitterProgram :: Program是一个 OpenGL 着色器程序。但是其他条目呢?整个TextureBlitter应该代表什么?

编辑:我在存储库着色器中发现了同名的着色器:

//textureblitter.vert
#version 300 es
precision highp float;
uniform highp mat4 matrix;
in highp vec3 vertexCoordEntry;
in highp vec2 textureCoordEntry;
out highp vec2 textureCoord;
void main() {
textureCoord = textureCoordEntry;
gl_Position = matrix * vec4(vertexCoordEntry, 1.);
}

//textureblitter.frag
#version 300 es
precision highp float;
uniform sampler2D uTexSampler;
in highp vec2 textureCoord;
out highp vec4 fragmentColor;
void main() {
fragmentColor = texture2D(uTexSampler, textureCoord);
}

我不使用Haskell,也不使用它的OpenGL包。但是您公开的名称和着色器非常具有描述性。我将尝试解释OpenGL术语中的纹理是什么。

假设您有一张尺寸为宽 x 高的图片。假设它保存在一个二维的、[w,h]大小的矩阵中。
与其通过 a,b 坐标来访问该矩阵中的像素,不如使用规范化坐标(即在 [0-1] 范围内):u= a/wv= b/h。这些公式需要u和类型为floatv,因此不会四舍五入为整数。

使用u,v坐标允许我们访问"通用"矩阵中的任何像素。

现在,您要在屏幕上显示该图片。它的矩形可以通过透视投影进行缩放、旋转甚至变形。不知何故,你知道那个矩形的最后四个坐标。

如果还使用归一化坐标(同样在 [0-1] 范围内),则图片坐标和矩形坐标之间的映射会使图片调整为 [可能变形] 矩形。

这就是OpenGL的工作方式。传递矩形的顶点,并使用某些矩阵计算其规范化的最终坐标。您还可以传递图片矩阵(称为纹理)并将其映射到这些最终坐标。

完成所有这些计算和映射的程序是一个着色器,它通常由两个子着色器组成:一个逐个顶点工作的顶点着色器(VS 每个顶点只运行一次);和一个处理片段(顶点之间的插值点)的片段着色器

纹理闪光或"将图片涂在屏幕上的对象">

  • 设置要使用的程序(着色器)。您可以有多个着色器 具有不同的效果(例如修改图片的颜色)。只需选择一个。
  • 设置顶点。AttribLocation表示 顶点与使用它的着色器之间的连接 (着色器用语中的属性)。
  • "图片"坐标相同。
  • 设置用于变换顶点的矩阵。因为它是一样的 所有顶点,使用另一种类型的连接:UniformLocation(一个着色器用语中的统一)。

我想你可以找到一个很好的教程,其中包含有关如何设置和使用此"纹理闪光器"的示例。

最新更新