了解Haskell图形程序中的TextureBlitt是什么
在私有窗口管理器/合成器Haskell存储库中,我遇到了以下我试图理解的数据类型:了解Haskell图形程序中的TextureBlitt是什么,haskell,graphics,opengl-es,window-managers,Haskell,Graphics,Opengl Es,Window Managers,在私有窗口管理器/合成器Haskell存储库中,我遇到了以下我试图理解的数据类型: data TextureBlitter = TextureBlitter { _textureBlitterProgram :: Program, -- OpenGL Type _textureBlitterVertexCoordEntry :: AttribLocation, -- OpenGL Type _textureBlitterTextureCoordEn
data TextureBlitter = TextureBlitter {
_textureBlitterProgram :: Program, -- OpenGL Type
_textureBlitterVertexCoordEntry :: AttribLocation, -- OpenGL Type
_textureBlitterTextureCoordEntry :: AttribLocation, -- OpenGL Type
_textureBlitterMatrixLocation :: UniformLocation -- OpenGL Type
} deriving Eq
类型Program
、AttribLocation
和UniformLocation
都来自于此
问题:我在网上找不到关于“纹理闪电器”概念的好信息。所以我希望有更多专业知识的人能马上对这种类型(可能)的用途有一个很好的猜测
我假设字段\u textureBlitterProgram::Program
是一个OpenGL着色器程序。但是其他的条目呢?作为一个整体,texturebillt
应该代表什么
编辑:我在我的回购着色器中发现了同名的:
//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.);
}
及
我不使用haskell或它的OpenGL包。但是您公开的名称和着色器非常具有描述性。我将尝试用OpenGL术语解释什么是纹理。 假设你有一张宽x高的照片。假设它保存在二维矩阵中。
我们使用标准化坐标(即在[0-1]范围内):
u=a/w
和v=b/h
,而不是通过a、b坐标来访问矩阵中的像素。这些公式需要u
和v
类型的float
,因此不会对整数进行舍入。
使用u,v
坐标可以访问“通用”矩阵中的任何像素。
现在,您希望在屏幕上显示该图片。它的矩形可以通过透视投影进行缩放、旋转甚至变形。不知怎的,你知道矩形的最后四个坐标。
如果还使用标准化坐标(同样在[0-1]范围内),则图片坐标和矩形坐标之间的映射会使图片调整为[可能变形的]矩形。
这就是OpenGL的工作原理。传递矩形的顶点,并使用一些矩阵计算它们的标准化最终坐标。您还可以传递图片矩阵(称为纹理)并将其映射到这些最终坐标。
完成所有这些计算和映射的程序是一个着色器,它通常由两个子着色器组成:一个逐顶点工作的顶点着色器(VS每个顶点只运行一次);和一个碎片着色器,用于碎片(顶点之间的插值点)
textureblitt或“将图片快速显示在屏幕上的对象”- 设置要使用的程序(着色器)。可以有多个着色器 具有不同的效果(例如修改图片的颜色)。只要选择一个
- 设置顶点。
表示工作点 顶点与使用它的着色器之间的连接 (着色器术语中的属性)attribloation
- “图片”坐标也一样
- 设置变换顶点的矩阵。因为这对我来说是一样的
在所有顶点中,使用另一种类型的连接:
(一种 用着色器的说法是统一的)UniformLocation
我想你可以找到一个很好的教程,里面有关于如何设置和使用这个“纹理blitter”的示例。我不使用haskell或它的OpenGL包。但是您公开的名称和着色器非常具有描述性。我将尝试用OpenGL术语解释什么是纹理。 假设你有一张宽x高的照片。假设它保存在二维矩阵中。
我们使用标准化坐标(即在[0-1]范围内):
u=a/w
和v=b/h
,而不是通过a、b坐标来访问矩阵中的像素。这些公式需要u
和v
类型的float
,因此不会对整数进行舍入。
使用u,v
坐标可以访问“通用”矩阵中的任何像素。
现在,您希望在屏幕上显示该图片。它的矩形可以通过透视投影进行缩放、旋转甚至变形。不知怎的,你知道矩形的最后四个坐标。
如果还使用标准化坐标(同样在[0-1]范围内),则图片坐标和矩形坐标之间的映射会使图片调整为[可能变形的]矩形。
这就是OpenGL的工作原理。传递矩形的顶点,并使用一些矩阵计算它们的标准化最终坐标。您还可以传递图片矩阵(称为纹理)并将其映射到这些最终坐标。
完成所有这些计算和映射的程序是一个着色器,它通常由两个子着色器组成:一个逐顶点工作的顶点着色器(VS每个顶点只运行一次);和一个碎片着色器,用于碎片(顶点之间的插值点)
textureblitt或“将图片快速显示在屏幕上的对象”- 设置要使用的程序(着色器)。可以有多个着色器 具有不同的效果(例如修改图片的颜色)。只要选择一个
- 设置顶点。
表示工作点 顶点与使用它的着色器之间的连接 (着色器术语中的属性)attribloation
- “图片”坐标也一样
- 设置变换顶点的矩阵。因为这对我来说是一样的
在所有顶点中,使用另一种类型的连接:
(一种 用着色器的说法是统一的)UniformLocation
我想你可以找到一个很好的教程,里面有关于如何设置和使用这个“纹理blitter”的示例。大概TextureBlitter是一个blits纹理的东西,你可以很容易地找到
程序是一个OpenGL着色器程序,AttriblLocation
是对顶点att的引用
//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);
}