什么是顶点颜色?


31

我的问题是标题中写的是什么。这个术语“顶点颜色”出现很多。我很难理解这一点。

例如:

3D空间上的顶点不是简单点吗?如果是这样,一个点怎么能有颜色?还是这种“颜色”意味着其他?

虚幻引擎的材质编辑器中有一个“顶点颜色”节点。

有人可以阐明我的问题吗?当我搜索“什么是顶点颜色”时,找不到任何有用的东西,但是文档对我来说太技术性了。


2
在几何中,顶点只是空间中的一个点。但是对于3D渲染,您希望外观看起来不错,这可能意味着将更多信息附加到每个顶点,例如颜色,纹理坐标或骨架权重,以便您可以更轻松地对网格进行动画处理,或在照明中使用法线方向计算。
user253751 '17

3
我认为您的困惑很大一部分是由于3D /图形中术语“顶点”和“位置”的频繁混合。从数学上来说,您的陈述“不是3D空间中的顶点简单点吗?”是正确的,但是在游戏引擎和图形领域,不,位置是3D空间中的简单点;(网格)顶点是一条几乎总是具有位置的数据,但也可能具有法线,切线,纹理坐标,颜色和/或许多其他数据中的任何一个。网格顶点实际上只是在渲染的顶点阶段处理的数据块。
Slipp D. Thompson

Answers:


29

当您拥有完全纹理化的3d网格时,顶点颜色并不重要。但是,当您拥有无纹理但有色的网格时,它会变得很有趣。在这种情况下,您可以为每个顶点分配颜色。然后,着色器将通过在三个顶点的颜色之间进行插值来为多边形的每个像素着色。

与纹理结合使用时,顶点颜色有时也可能很有趣。当您想使用诸如Gouraud Shading之类的着色算法时,只需计算每个顶点上的光强度,将光颜色分配给该顶点作为顶点颜色,然后在渲染纹理时将每个纹理像素的颜色值乘以插值的颜色。这使您可以在顶点着色器而不是像素着色器中计算光源。这通常要快得多,因为顶点着色器通常执行的频率要低得多。


2
顺便说一句,在一些没有任何动态闪电/阴影的较旧游戏中使用了顶点颜色。例如,2004年的Richard Burns Rally使用顶点颜色创建不同外观的纹理并应用阴影。
马丁

见证人是最近使用的游戏,它广泛使用了顶点颜色和光照贴图,但是纹理却很少。
user253751

@Philipp“因为通常不那么频繁地执行顶点着色器”,为什么?渲染管道中的顶点着色器部分不是每个帧都要执行的吗?为什么这么少?是否也不必像在像素着色器中一样在每一帧中都计算顶点“颜色”?
Nikos

1
@Nikos每个顶点调用一次顶点着色器。然后每个像素调用一次像素着色器。具有3个顶点的多边形通常会产生3个以上的屏幕像素(如果您的游戏最终计算出许多覆盖少于3个像素的多边形,则您可能需要研究关于剔除和LOD的方法)。
菲利普

25

从理论上讲,“顶点颜色”(Vertex Color)允许为模型着色,而不必理会纹理。这在CAD中很常见。

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

实际上,它只是一个插槽,您可以用来将数据推入顶点,然后在顶点着色器中使用该插槽执行疯狂的工作

“不是3D空间上的顶点简单点吗?”

刚开始使用3D时,我就是这么想的。我很快就知道自己错了

您可以将顶点视为一个数据斑点,它构成您要在屏幕上绘制的三角形的一个角(“角”部分或“三角形”,“绘制”或“屏幕”部分都不总是正确的) )。位置是我们称为“顶点”的数据Blob的一个-可选-方面。

通过将其他数据附加到顶点,您可以做很多事情。最著名的示例是,您可以添加uv坐标在该三角形上绘制纹理。如果只有一点,您(通常)无法决定要在三角形上绘制纹理的哪一部分-您也需要纹理坐标。

关于该斑点的其他标准实例包括法线和切线。重要的是它们都是可选的,包括位置。“顶点颜色”只是这些可选输入之一,您可以使用或滥用它们在屏幕上创建漂亮的图片。


2
“ ..作为构成三角形边缘的数据块”并不是必须的。可以将顶点渲染为点。
克罗姆斯特表示支持莫妮卡

3
对于可以使用顶点颜色实现的着色器效果的一些很好的例子,我强烈建议您查看去年娜塔莉·伯克(Natalie Burke)的GDC演讲“动画与数学”(目前视频仅供会员使用,但此处免费提供幻灯片) 。她展示了使用顶点着色器(通过顶点颜色通道进行成形和控制)可以实现Destiny齿轮,角色头发和衣服中的动画,甚至是敌人和环境的一部分动画。
DMGregory

5
我认为,这些不是顶点颜色,而是将顶点属性显示为颜色,以便于感知。
Kromster表示支持Monica's

谈论FortNite时,顶点着色器也有一些类似的创造性用法,尽管如果我没记错的话,我认为它们主要使用了顶点的UV通道,而不是颜色通道。
DMGregory

3
从基于几何/数学的角度严格来说,顶点只是空间中的一个点。“顶点颜色”是GPU使用的顶点的“想法”应用于顶点的属性。它与是否有颜色的圆圈相同。圆的几何/数学“想法”没有颜色,但是圆的渲染软件“想法”将颜色与圆相关联。因此,@ Kromster的论点在技术上更正确。
法拉普

8

顶点可以有颜色,就像它的法线一样,它是一种属性。

在3d环境中,三角形根据其顶点的颜色信息进行着色。最接近顶点A的片段获得其颜色,最接近顶点B的片段获得其B的色元,颜色在2之间进行插值。

它的工作方式与逐顶点照明相同

这是一种无需使用纹理即可向模型添加颜色的简便方法。


+1给出(希望)熟悉的另一个相似顶点属性的示例
AC

顶点颜色和法线的问题在于,它们假定顶点是网格的一部分(曲面的近似值)。如果要使用锐利的边缘或使用不同颜色的面(例如在多维数据集上),则每个面都需要单独的顶点,这将大大增加内存使用量(并降低渲染速度)。

@aml您可以在glsl中使用平坦的“运算符”来输出,以使阴影看起来平坦。并非完全相同,但可以。
巴林特

其他插值属性:纹理坐标和z缓冲区!我们让顶点着色器为三角形的三个顶点中的每个顶点计算一些数据,这些顶点在屏幕上(或在某些缓冲区中)绘制三角形时进行插值,并且为每个绘制像素的插值调用像素着色器
user1952009

@aml当然,x2不是瓶颈。我想说,并且为此创建了几何着色器(例如:将深度纹理转换为三角形
user1952009

2

这里已经有了可靠的答案-我只想用一种更常见的方式来了解一下您所使用的顶点颜色:

单个批处理/绘制调用中的对象颜色(或其他属性)不同。

您将看到它用于渲染粒子系统,文本和批处理(通常是图集)的精灵。

想象一下,您有一个粒子发射器,该粒子发射器以随机的初始颜色生成粒子,或者在粒子的整个生命周期中渐变为0 alpha。如果要使用着色器制服发送此颜色数据,则需要在其自己的绘制调用中绘制每个不同颜色的粒子,这会使粒子系统更加昂贵。相反,我们可以将这些颜色烘焙到粒子的顶点数据中,然后在一次调用中将整个批处理一起渲染。

Unity似乎将这种技术用于粒子颜色变化,以及为一批一起渲染的TextMesh或Sprites中的各个字符着色。

我相信您可以在几何实例化方面做类似的事情,但是我不知道两者在性能上如何比较。今天,通过顶点颜色进行这种类型的实例调整可能更多地是为了支持像某些移动设备一样支持OpenGL 3.1 / DX9之前的硬件,而不是现代PC的最佳实践。我将欢迎那些通过批处理和实例化完成更多性能调整的人发表评论,以帮助弄清这些技术是否已为此目的取代了顶点颜色。:)

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.