游戏中图形的表现大多来自于纹理,纹理使用最多的是Texture2D,Texture2D继承自Texture,Texture里面大多是对纹理的一些参数的设置,那些设置对于2d3d纹理是通用的,本篇就来看看texture2D具体是如何工作的。
using System;
using System.Runtime.CompilerServices;
using UnityEngine.Internal;
namespace UnityEngine
{
public sealed class Texture2D : Texture
{
获取纹理的级数,这个级数首先是开启了mipmap,读取一张图片时,计算机会生成多张纹理,根据观察者与物体的远近选择不同的纹理。
public extern int mipmapCount
{
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
get;
}
获取纹理格式,比如RGBA32什么的
public extern TextureFormat format
{
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
get;
}
这是一个静态方法,获取一个纯白色的纹理,测试了一下,该纹理的尺寸为(0.3,0.3)
public static extern Texture2D whiteTexture
{
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
get;
}
也是个静态方法,获取一个纯黑色纹理,注意的是透明度也是0
public static extern Texture2D blackTexture
{
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
get;
}
创建一个自定义尺寸的纹理,当然其他都是默认值
public Texture2D(int width, int height)
{
Texture2D.Internal_Create(this, width, height, TextureFormat.ARGB32, true, false, IntPtr.Zero);
}
通过限制尺寸,像素格式,是否多级别纹理来创建一个纹理
public Texture2D(int width, int height, TextureFormat format, bool mipmap)
{
Texture2D.Internal_Create(this, width, height, format, mipmap, false, IntPtr.Zero);
}
通过限制尺寸,像素格式,是否多级别纹理,是否使用线性滤波方式来创建一个纹理
public Texture2D(int width, int height, TextureFormat format, bool mipmap, bool linear)
{
Texture2D.Internal_Create(this, width, height, format, mipmap, linear, IntPtr.Zero);
}
与上面的创建方式不一样的地方是,传入了一个本地的纹理,利用本地纹理创建一个新的纹理,而这个nativeTex可以通过Texture中GetNativeTextureID获得
internal Texture2D(int width, int height, TextureFormat format, bool mipmap, bool linear, IntPtr nativeTex)
{
Texture2D.Internal_Create(this, width, height, format, mipmap, linear, nativeTex);
}
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_Create([Writable] Texture2D mono, int width, int height, TextureFormat format, bool mipmap, bool linear, IntPtr nativeTex);
public static Texture2D CreateExternalTexture(int width, int height, TextureFormat format, bool mipmap, bool linear, IntPtr nativeTex)
{
return new Texture2D(width, height, format, mipmap, linear, nativeTex);
}
利用纹理id来更新当前纹理
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern void UpdateExternalTexture(IntPtr nativeTex);
设置纹理中指定坐标的颜色值,注意之后必须调用apply才起作用
public void SetPixel(int x, int y, Color color)
{
Texture2D.INTERNAL_CALL_SetPixel(this, x, y, ref color);
}
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void INTERNAL_CALL_SetPixel(Texture2D self, int x, int y, ref Color color);
获取像素值
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Color GetPixel(int x, int y);
通过uv坐标值获取像素
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Color GetPixelBilinear(float u, float v);
[ExcludeFromDocs]
public void SetPixels(Color[] colors)
{
int miplevel = 0;
this.SetPixels(colors, miplevel);
}
public void SetPixels(Color[] colors, [DefaultValue("0")] int miplevel)
{
int num = this.width >> miplevel;
if (num < 1)
{
num = 1;
}
int num2 = this.height >> miplevel;
if (num2 < 1)
{
num2 = 1;
}
this.SetPixels(0, 0, num, num2, colors, miplevel);
}
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern void SetPixels(int x, int y, int blockWidth, int blockHeight, Color[] colors, [DefaultValue("0")] int miplevel);
[ExcludeFromDocs]
public void SetPixels(int x, int y, int blockWidth, int blockHeight, Color[] colors)
{
int miplevel = 0;
this.SetPixels(x, y, blockWidth, blockHeight, colors, miplevel);
}
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern void SetPixels32(Color32[] colors, [DefaultValue("0")] int miplevel);
[ExcludeFromDocs]
public void SetPixels32(Color32[] colors)
{
int miplevel = 0;
this.SetPixels32(colors, miplevel);
}
通过读取文件数据来加载纹理数据
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern bool LoadImage(byte[] data);
通过读取文件数据来加载纹理数据
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern void LoadRawTextureData(byte[] data);
[ExcludeFromDocs]
public Color[] GetPixels()
{
int miplevel = 0;
return this.GetPixels(miplevel);
}
public Color[] GetPixels([DefaultValue("0")] int miplevel)
{
int num = this.width >> miplevel;
if (num < 1)
{
num = 1;
}
int num2 = this.height >> miplevel;
if (num2 < 1)
{
num2 = 1;
}
return this.GetPixels(0, 0, num, num2, miplevel);
}
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Color[] GetPixels(int x, int y, int blockWidth, int blockHeight, [DefaultValue("0")] int miplevel);
[ExcludeFromDocs]
public Color[] GetPixels(int x, int y, int blockWidth, int blockHeight)
{
int miplevel = 0;
return this.GetPixels(x, y, blockWidth, blockHeight, miplevel);
}
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Color32[] GetPixels32([DefaultValue("0")] int miplevel);
[ExcludeFromDocs]
public Color32[] GetPixels32()
{
int miplevel = 0;
return this.GetPixels32(miplevel);
}
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern void Apply([DefaultValue("true")] bool updateMipmaps, [DefaultValue("false")] bool makeNoLongerReadable);
[ExcludeFromDocs]
public void Apply(bool updateMipmaps)
{
bool makeNoLongerReadable = false;
this.Apply(updateMipmaps, makeNoLongerReadable);
}
[ExcludeFromDocs]
public void Apply()
{
bool makeNoLongerReadable = false;
bool updateMipmaps = true;
this.Apply(updateMipmaps, makeNoLongerReadable);
}
重新设定纹理参数
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern bool Resize(int width, int height, TextureFormat format, bool hasMipMap);
public bool Resize(int width, int height)
{
return this.Internal_ResizeWH(width, height);
}
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
private extern bool Internal_ResizeWH(int width, int height);
决定纹理的质量
public void Compress(bool highQuality)
{
Texture2D.INTERNAL_CALL_Compress(this, highQuality);
}
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void INTERNAL_CALL_Compress(Texture2D self, bool highQuality);
传进来一个纹理集合,把多个纹理打包为当前纹理
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Rect[] PackTextures(Texture2D[] textures, int padding, [DefaultValue("2048")] int maximumAtlasSize, [DefaultValue("false")] bool makeNoLongerReadable);
传进来一个纹理集合,把多个纹理打包为当前纹理
[ExcludeFromDocs]
public Rect[] PackTextures(Texture2D[] textures, int padding, int maximumAtlasSize)
{
bool makeNoLongerReadable = false;
return this.PackTextures(textures, padding, maximumAtlasSize, makeNoLongerReadable);
}
传进来一个纹理集合,把多个纹理打包为当前纹理
[ExcludeFromDocs]
public Rect[] PackTextures(Texture2D[] textures, int padding)
{
bool makeNoLongerReadable = false;
int maximumAtlasSize = 2048;
return this.PackTextures(textures, padding, maximumAtlasSize, makeNoLongerReadable);
}
public void ReadPixels(Rect source, int destX, int destY, [DefaultValue("true")] bool recalculateMipMaps)
{
Texture2D.INTERNAL_CALL_ReadPixels(this, ref source, destX, destY, recalculateMipMaps);
}
[ExcludeFromDocs]
public void ReadPixels(Rect source, int destX, int destY)
{
bool recalculateMipMaps = true;
Texture2D.INTERNAL_CALL_ReadPixels(this, ref source, destX, destY, recalculateMipMaps);
}
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void INTERNAL_CALL_ReadPixels(Texture2D self, ref Rect source, int destX, int destY, bool recalculateMipMaps);
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern byte[] EncodeToPNG();
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern byte[] EncodeToJPG(int quality);
public byte[] EncodeToJPG()
{
return this.EncodeToJPG(75);
}
}
}