Texture2D详解

发表于2018-11-25
评论0 2.4k浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏程序行业精英群

711501594
什么是Texture2D


如上图,Texture2D是一张二维图片,是由一颗一颗像素组成的。

通常是由低到高,由左到右排列的。

如果想要通过代码操作像素,我们必须要知道像素的坐标位置,现在我们来验证下是否真的如此排列。

我们通过简短的代码,NEW一个图片,并且根据X,Y轴对应R,G通道,逐像素赋值。我们将得到一张红绿渐变图,如下:

根据图片的颜色渐变过程,我们可以确信,像素排列顺序是和我们预测的一样。

TextureFormat是什么

TextureFormat为贴图的类型,ARGB32位,代表有ARGB4个通道,每个通道的颜色有8位,对应的还有A8,RGB24等。任何图片从本质上就是这样的。

而常见的JPG,PNG等是操作系统采用的压缩/非压缩读取格式,ETC/DDS为图形接口读取的压缩格式。

赋值完后为什么要Apply

因为在贴图更改像素时并不是直接对显存进行更改,而是在另外一个内存空间中更改,这时候GPU还会实时读取旧的贴图位置。

当Apply后,CPU会告诉GPU你要换个地方读贴图了。

所有的图片的像素排列顺序都一样吗?

事实上OpenGL和DX在UV方向和取值上是不同的,在此我们应该感谢Unity3D为我们做的那些事,让一切变得简单。

制作一个简单的笔刷

最终效果

实现轮廓

我们对上面的代码稍作修改。

我们在第一个红线引入一张贴图,第二个红线,将像素乘以这张贴图对应位置的alpha通道。

在色阶上每个通道是8位,0-255,但在计算时为浮点数。0~1。

所以如果alpha为0,任何颜色乘以他,结果都为0。

通过以上代码,我们实现如下效果:

这张贴图是张Alpha通道为0和1的通道,1为有颜色,0自然就没有颜色。也可以通过0-1之间的值实现渐变。

同样的,因为只用到一个通道,我们可以将它压缩为一张Alpha8的单通道8位贴图,来节省空间。

实现纹理

我们再次对上述代码进行更改,同样引入一张贴图来做纹理。

这次我们进行颜色相乘,因为颜色为浮点值,所以他们乘后的结果不会大于1,也不会小于0。

而重载运算符,在*的过程中,帮我们把RGBA通道一一对应的运算。

这里我们用到了相乘,很多人在用图像软件时,会遇到,相乘,相加,相除,相减等词汇。

一开始会很纳闷,为什么要这样命名。现在我们知道了,他们是在像素之间的数学运算关系。


通过以上简短的代码,我们就实现了一个比较复杂且完整的功能。

原文链接

著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

游戏学院公众号二维码
腾讯游戏学院
微信公众号

提供更专业的游戏知识学习平台