Sprite和Texture有什么区别?


27

我要完成大学的一项任务,我的任务是讨论视频游戏中使用的纹理以及它们的演变方式。

我的主要问题是,使用精灵或使用其他纹理方法之间的根本区别是什么?

我自己做了一些研究,似乎倾向于将Sprites将图像存储在一个文件中,并且可以将其用于动画等。并且通常在较旧的视频游戏中使用,通常将Sprites作为其所有游戏视觉效果。现在,在现代游戏中,我相信随着技术的进步以及诸如凹凸贴图等其他纹理的出现,精灵将越来越少地被使用。尽管今天仍然使用精灵来容纳诸如健康栏或长距离纹理之类的功能。

但是,使用纹理而不是精灵的主要优点是什么?



5
一种是饮料,而另一种则不是(我为这个笑话道歉)
CAD97,2017年

Answers:


37

归根结底,子画面和纹理只是图像-光栅颜色数据块(尽管有时我们会稍微增加一些边界以将非图像数据放入其中)。区别主要在于我们如何使用它们。

如果将其预期的渲染目的直接绘制到屏幕的2D网格而没有透视变形,则通常将图像(或包含许多独立片段的图像部分)称为“精灵”。因此,在运行的游戏中看到的基本上是在图像文件本身中看到的(除了颜色着色/调色板交换/透明效果)。这适用于2D游戏中的背景图块和角色/交互式对象,“广告牌”卡(例如粒子和较旧样式的树和灌木渲染),也适用于3D游戏中的用户界面元素和图标。

相反,如果我们使用图像来提供3D对象的多边形的表面细节(可能是在透视图中绘制),则通常将该图像称为“纹理”。该名称已延续到图像数据的其他用途,以调制其他物体的渲染,即使它们不再与您指尖所能感觉到的纹理有关,例如反射,变形贴图,覆盖,蒙版或其他任何东西通用图像的使用,我们不觉得更具体地命名往往会被我们宽松的命名法中的“纹理”所迷惑。

这使得两者之间的界限变得模糊而不是特别严格。如果我的图像包含一系列火焰和烟流,可用于绘制广告牌粒子以产生爆炸效果,则可以互换地称其为“ spritesheet”或“ Flipbook纹理”。或者,如果我有一个包含2D游戏所有背景图块的tileset图像,那么我今天可以将其称为“纹理图集”,类似于为3D游戏开发的图集纹理,即使其数据和在我的2D游戏中的使用无法区分从别人所谓的spritesheet。如果我有一个几何矩形,其目的是在屏幕上显示单个图像,则根据我要强调的使用方式,我可以称其为“纹理四边形”或“精灵”。

(请注意,在此最后一个示例中,“ sprite”既代表我们游戏资产中的源图像段,也代表使用该图像段的渲染游戏实体的实例-这是我们不一致地使用此术语的另一种方式)

您会发现一些引擎和库在将意图转换成它们自己的名称时对这种区别进行了编码。例如,在Unity中,您可以选择将图像资产导入为“ Sprite”-这将启用UI图像或2D游戏资产通常需要的一组额外选项,例如Spritesheet切片和打包,以及引用功能图像的各个部分作为场景和对象设置中的离散实体。在这些情况下,“ Sprite”通常意味着“图像(纹理)加元数据 ”-但仍与引擎盖下的普通纹理相同。额外的包装很方便,因此我们不需要在要使用图像的任何地方进行显微胶印。


“纹理”通常包含或允许透明像素吗?我会认为一个对象的行为就像一个像素映射的平面,无论透明表面是否垂直于相机轴,该平面都包含透明像素作为“精灵”。
超级猫

2
他们当然可以不放弃其“纹理”标题。常见的是,人们将要渲染的图像(例如叶子或链节栅栏)称为“叶子纹理”或“栅栏纹理”,即使它们是使用alpha测试/仿色或alpha混合透明度进行渲染的。如果将叶子案例渲染为面向相机的广告牌,我们也可以将其称为“叶子精灵”,但是如果将其用于3D栅栏等透视几何体,则通常不使用该精灵名称。
DMGregory

渲染不透明的纹理映射对象时,渲染引擎不必担心它们内部的外观,因为不透明的表面会隐藏内部。我认为最好是通过做不透明部分,然后将部分透明的部分渲染为离散的部分透明的表面,来渲染树或链节围栏之类的东西。尽管它们可能不匹配某些不面对镜头的人所说的“小精灵”,但它们也不会与“正常”对象相同。
超级猫

实际上通常就是这样做的。栅栏和树干的几何图形以不透明的路径渲染,然后栅栏跨度和枝条/树枝的几何图形随后通过alpha测试或alpha混合路径进行渲染。
DMGregory

1
我通常会听到“透明纹理”或“ alpha纹理” /“带有alpha的纹理”,如果是经过严格边缘/ alpha测试的透明性,则有时可能会听到“ cutout” /“ cutout texture”。
DMGregory

7

精灵是计算机游戏历史上的遗物。想一下大约8位Ataris。1980年。一张小图像,通常带有覆盖位掩码(或特殊的“透明”颜色),该图像在屏幕上具有一定位置,并以某种特定方式组合到屏幕上。根据覆盖图,在精灵中有“洞”的地方有洞。通常以“正当可行”的方式,并且通常通过保存和恢复被覆盖的原始屏幕像素,来轻松地让东西四处走动的错觉。

过去是精灵是计算机上的硬件功能,曾经是您可以在屏幕内容自动保存的情况下绘制/取消绘制,曾经是您只能拥有非常有限的数量(而且不重叠,是的!) ,并且过去它们的体积很小(如16x16),并且数量有限。

如今,鼠标光标是最接近精灵的对象(以前,在大约10-15年前,它某些系统上的实际精灵)。

如今,确实没有这种东西存在,但是这个词仍然存在。子画面基本上是您在某处绘制(合成)的小型2D图像。通常通过绘制一个小的纹理四边形。

另一方面,纹理是某种在更现代的图形API中使用的可读图像的概念。或者,更确切地说,是一个内存区域(用现代API而言是“缓冲区”),带有一些相关的额外数据,例如大小,可以通过某种方式从中进行采样。通常但不一定由运行在图形处理单元上的着色器构成。通常(但不一定)使用规范化的坐标,并且通常(但不一定)使用过滤(和mipmapping,以及某些特定的边框模式以及and和and and ...)。

因此,纹理可能是您用来绘制精灵的数据源。


3
适当的精灵被覆盖在硬件中,因此内存中的视频数据不会改变,甚至不必使用相同的模式(例如,在C64上,您可以在文本背景上方使用位图精灵)。通过保存位图并替换数据而呈现的对象称为BOB(闪光对象)。
西蒙·里希特

1
@SimonRichter:我不熟悉C64,像玩具一样执行,但是Amiga也有,如果我没记错的话,有8个。不知道它在硬件级别上是如何工作的,但也可能是直接覆盖的(似乎很可能)。在ST上,A00D/ AOOC操作码精灵肯定是可绘制/未绘制帧缓冲区修改类型的。BOB,是的,也存在,典型的Amiga东西。我猜,那是最接近当今纹理的东西(任何大小,一次上传到图形处理器,绘制多次)。
达蒙

4

这有点像苹果和橘子的比较。纹理只是图像,而精灵是图像及其使用方式。

我们仍然将精灵用于2D游戏,它们会以3D游戏的粒子效果显示。如今,精灵通常指的是某种纹理的四边形,或者(我认为很少)是单个三角形。甚至UI元素通常仍是带纹理的四边形-我称之为精灵。

以前的情况是,子画面会预先加载到内存中,然后像戳记一样,将其blit(逐字节逐字节复制)到屏幕上的各个点(从字面上看,是屏幕内存)。在某种程度上,我们仍然这样做。对于精灵动画,我们经常更改源纹理的样本坐标,以从纹理中复制片段以渲染到四边形上。诸如凹凸贴图之类的着色器效果以相同的方式从纹理中采样,因此仍然可以用于例如精灵中的发光效果。

对于2D游戏更是如此,这是一种风格选择。例如,可以在游戏中使用精灵合成手绘或绘制的角色。从技术上讲,南方公园的比赛就是一个例子。

因此,您不能真正使用纹理代替精灵。


3

这是一个简单简短的答案。我通常将sprite视为整个对象本身,以及应用于该对象的任何功能和纹理。至于纹理,我几乎认为它只是可以应用于某些物体的图像。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.