2013-03-01 00:48:22 jeksonal 阅读数 33665

动态更改材质球纹理的步骤:

1:找到对应的材质球

2:更改材质球纹理 ---->  renderer.material.mainTexture = "目标纹理";



代码如下:


点击按钮,就能实现对应功能



2015-09-18 16:38:28 asd237241291 阅读数 11299

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术交流QQ群:【119706192本文链接地址: Unity3D for Android 纹理压缩支持


首先附图:Unity3D for Android支持的纹理压缩格式


纹理压缩可以通过减少内存来显著地提高OpenGL的性能,使内存使用的效率更高。

Android设备支持很多格式的纹理压缩,这些纹理压缩格式并不是在所有的设备上面都支持,根据GPU芯片和OpenGL实现的不同略有差异。

    一些常见的纹理压缩格式有以下几种:

  • DXT(Tegra-NVDIA分为DXT1-DXT5这五个级别,Terga支持的实际上是DXT1DXT3DXT5使用不是很广泛。它支持包含4位或者8alpha通道的RGB纹理。
  • PVRTC(PowerVR不失真压缩率最高的压缩格式。特别的TBDR架构,不渲染被遮挡的部分,有效节省计算资源和带宽。纹理压缩在许多设备上面都支持,支持每个像素2位或者4位的纹理,包含或者不包含alpha通道都可以。
  • ATC(Adreno)- 高通ATI纹理压缩在许多设备上面都支持,它支持RGB纹理压缩但不包含alpha通道。
  • ETC1 or RGBA16 (GLES2.0)大部分移动GPU都会支持的纹理标准。不支持Alpha通道
  • ETC2 (GLES3.0)补全了ETC1不支持Alpha通道,支持更高质量的RGBA(RGB+Alpha)压缩。
  • ASTC

Open GL ES

Androidframework APINDK都提供了对OpenGL的支持

Android系统使用 OpenGL 的标准接口来支持3D图形功能

Android 3D 引擎采用的是OpenGL ES。OpenGL ES是一套为手持和嵌入式系统设计的3D引擎API

    Android 目前支持下面几个版本的OpenGL ES API 

  • OpenGL ES 1.0 和 1.1 :Android 1.0和更高的版本支持这个API规范。
  • OpenGL ES 2.0 : Android 2.2(API 8)和更高的版本支持这个API规范。
  • OpenGL ES 3.0 : Android 4.3(API 18)和更高的版本支持这个API规范。
  • OpenGL ES 3.1 : Android 5.0(API 21)和更高的版本支持这个API规范。

 

支持OpenGL ES 3.0API需要实现设备生产厂家提供的图形管道,所以一个Android4.3或者更高版本的设备可能并不支持OpenGL ES 3.0

附图:android操作系统趋势 (2015-08

地址:http://www.umindex.com/devices/android_os



2017-02-07 16:09:27 swj524152416 阅读数 11502

  Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式

  在Texture2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,如IOS设置成PVRTC4,Android平台设置成RGBA16等。嗯,非常的智能。

  但是,在一些进阶的使用中,一些情况是难以满足的。比如,我们NGUI的图集中,在Android平台,使用ETC1纹理+Alpha通道图的方式;IOS平台,使用PVRTC4的纹理;部分要求清晰度较高的,使用RGBA16,但是使用RGBA16的渐变显示图片却惨不忍睹;一些要求高保真的,则需要直接使用RGBA32格式。有些时候,单纯的Unity纹理管理已经无法满足我们的需求了,需要做一下额外工作。

  总结一下我自己的纹理压缩方案:

纹理压缩的策略
  手游开发(Android/IOS)中,我会使用3个级别的压缩程度:高清晰无压缩、中清晰中压缩、低清晰高压缩;4种压缩方法:RGBA32, RGBA16+Dithering,ETC1+Alpha,PVRTC4。一般足够应付大部分的需求了。
  高清晰无压缩 - RGBA32

                
               Unity RGBA32 - 高清晰无压缩.png

  RGBA32等同于原图了,优点是清晰、与原图一致,缺点是内存占用十分大;对于一些美术要求最好清晰度的图片,是首选。

  要注意一些png图片,在硬盘中占用几KB,怎么在Unity中显示却变大?因为Unity显示的是Texture大小,是实际运行时占用内存的大小,而png却是一种压缩显示格式;可以这样理解,png类似于zip格式,是一个压缩文件,只不过在运行时会自动解压解析罢了。

中清晰中压缩 - RGBA16 + Dithering
  RGBA16+Dithering

               
             Unity RGBA16,不抖动处理的渐变图片惨不忍睹

  既然叫RGBA16,自然就是RGBA32的阉割版。
  对于一些采用渐变的图片,从RGBA32转换成RGBA16,能明显的看出颜色的层叠变化,如上图。

                

  采用Floyd Steinberg抖动处理后,除非放大,否则肉眼基本看不出区别
  RGBA16的优点,内存占用是RGBA32的1/2;搭配上Dithering抖动,在原尺寸下看清晰度一模一样;缺点,Unity原生不支持Dithering抖动,需要自己做工具对图片做处理;对于需要放大、拉伸的图片,Dithering抖动的支持不好,会有非常明显的颗粒感。

如何进行Dithering抖动?



  Texture Packer工具中Image Format选择RGBA4444,Dithering选择FloydSteinberg在我的项目中,TexturePacker具有非常重要的作用,像UI的图集生成,预先生成好正方形的IOS PVRTC4图集和非正方形的Android ETC1图集、 缩放原图50%等工作都由TexturePacker完成。

  同样,对图像进行抖动处理,也是预先在TexturePacker使用FloydSteinberg算法进行图像抖动,再在Unity中导入使用。

  TexturePacker提供命令行工具,可以做成自动化的工具。具体方法这里不详述。

RGB16

                
                    Unity RGB16

  而RGB16,是主要针对一些,不带透明通道,同时长宽又不是2的次方的图片;对于这些图片,使用RGB16可以降低一半的内存,但是效果会略逊于RGB32。

  当然了,RGB16其实也是可以搭配抖动,也能提升显示效果;但同样的Dithering抖动对拉伸放大是不友好的。

低清晰高压缩 - ETC1+Alpha/PVRTC4
  很多初学者都会疑惑,为什么游戏开发中经常看到一些图片,需要设置成2的次方?因为像ETC1、PVRTC4等这类在内存中无需解压、直接被GPU支持的格式,占用内存极低,而且性能效率也是最好的。
但是,相对RGBA32,还是能肉眼看出质量有所下降的。

ETC1
  ETC1+Alpha一般应用在Android版的UI图集中,ETC1不带透明通道,所以需要外挂一张同样是ETC1格式的Alpha通道图。方法是,在原RGBA32的原图中,提取RGB生成第一张ETC1,再提取A通道,填充另一张ETC1的R通道;游戏运行时,Shader将两张ETC1图片进行混合。

  生成Alpha通道图的方法可参考:
http://blog.csdn.net/u010153703/article/details/45502895

  要配合ETC1+Alpha,还需要Shader支持,这里提供参考直接修改NGUI的Unlit/Transparent With Colored的Shader。

            
                    Paste_Image.png

PVRTC4
  PVRTC4在Unity中是直接支持的,不过要注意的细节是,它必须是二次方正方形;也就是说,长宽在二次方的同时,还必须要相等。

几种纹理格式的对比

格式 内存占用 质量 透明 二次方大小 建议使用场合
RGBA32 1 ★★★★★ 无需 清晰度要求极高
RGBA16+Dithering 1/2 ★★★★ 无需 UI、头像、卡牌、不会进行拉伸放大
RGBA16 1/2 ★★★ 无需 UI、头像、卡牌,不带渐变,颜色不丰富,需要拉伸放大
RGB16+Dithering 1/2 ★★★★ 无需 UI、头像、卡牌、不透明、不会进行拉伸放大
RGB16 1/2 ★★★ 无需 UI、头像、卡牌、不透明、不渐变,不会进行拉伸放大
RGB(ETC1) + Alpha(ETC1) 1/4 ★★★ 需要二次方,长宽可不一样 尽可能默认使用,在质量不满足时再考虑使用上边的格式
RGB(ETC1) 1/8 ★★★ 需要二次方,长宽可不一样 尽可能默认使用,在质量不满足时再考虑使用上边的格式
PVRTC4 1/8 ★★ 需要二次方正方形,长宽一样 尽可能默认使用,在质量不满足时再考虑使用上边的格式
  • 内存占用,相对于RGBA32做比较
  • 质量星级,更多是本人感受,仅供参考

  在项目中,尽可能是使用ETC1和PVRTV4等GPU直接支持的图片格式,不仅内存占用低、性能也更好;当出现质量不及格时,再逐步的提升压缩格式,来满足需要。

  因此,实际项目中要混搭各种纹理格式。

2019-04-10 10:44:27 qq_44884706 阅读数 327

首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程

               

1. 简介

    在PC上开发时,其天空盒的效果很好,但是为Android平台Build之后,其效果简直没法看。

    更为恼火的是,之后PC上的纹理效果也变差了,新加入的纹理效果都会变差,看其纹理格式,使用ETC进行了压缩。

2. Unity3D默认纹理格式问题

2.1 在导入时是否自动压缩

     Edit->Preferences...

 

当选择此选项之后,每当导入新的纹理(无论是拖入或在文件管理器中copy),Unity3D都会根据当前平台的设置进行自动转换,此纹理转换,并不是把纹理文件进行修改,纹理文件是不动的,而是增加了一个.meta文件(如Sunny4_back.tif对应Sunny4_back.tif.meta),其中定义了很多与纹理相关的参数,其中决定此纹理格式的参数为:textureType,此文件内容如下:

fileFormatVersion: 2guid: e658bdd655d56c64eb2bf011d186cdedTextureImporter:  serializedVersion: 2  mipmaps:    mipMapMode: 0    enableMipMap: 1    linearTexture: 0    correctGamma: 0    fadeOut: 0    borderMipMap: 0    mipMapFadeDistanceStart: 1    mipMapFadeDistanceEnd: 3  bumpmap:    convertToNormalMap: 0    externalNormalMap: 0    heightScale: .25    normalMapFilter: 0  isReadable: 0  grayScaleToAlpha: 0  generateCubemap: 0  seamlessCubemap: 0  textureFormat: 4  maxTextureSize: 1024  textureSettings:    filterMode: -1    aniso: -1    mipBias: -1    wrapMode: -1  nPOTScale: 1  lightmap: 0  compressionQuality: 50  spriteMode: 0  spriteExtrude: 1  spriteMeshType: 1  alignment: 0  spritePivot: {x: .5, y: .5}  spriteBorder: {x: 0, y: 0, z: 0, w: 0}  spritePixelsToUnits: 100  alphaIsTransparency: 0  textureType: -1  buildTargetSettings: []  spriteSheet:    sprites: []  spritePackingTag:   userData: 

2.2 Unity3D设置纹理格式

    1) 选中纹理,纹理的Inspector窗口如下图所示:



上图显示的为Default设置,若Android平台没有单独设置, 则此纹理在Anroid平台采用默认设置,若Android平台单独设置了,则采用Android平台设置的格式。Unity3D只能设置三种纹理格式:Compressed、16bits、Truecolor,若要设置其它纹理格式,则Unity3D无能为力。

2.3 在Unity3D中自定义设置纹理格式

       把ChangeTextureImportSettings.cs放于Assets/Editor目录下,ChangeTextureImportSettings.cs内容如下:

using UnityEngine;using UnityEditor;// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// Batch Texture import settings modifier.//// Modifies all selected textures in the project window and applies the requested modification on the// textures. Idea was to have the same choices for multiple files as you would have if you open the// import settings of a single texture. Put this into Assets/Editor and once compiled by Unity you find// the new functionality in Custom -> Texture. Enjoy! :-)//// Based on the great work of benblo in this thread:// http://forum.unity3d.com/viewtopic.php?t=16079&start=0&postdays=0&postorder=asc&highlight=textureimporter//// Developed by Martin Schultz, Decane in August 2009// e-mail: ms@decane.net//// Updated for Unity 3.0 by col000r in August 2010// http://col000r.blogspot.com//// /////////////////////////////////////////////////////////////////////////////////////////////////////////public class ChangeTextureImportSettingsUnity3 : ScriptableObject {    [MenuItem ("Custom/Texture/Change Texture Format/Auto Compressed")]  static void ChangeTextureFormat_AutoCompressed() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.AutomaticCompressed);   }    [MenuItem ("Custom/Texture/Change Texture Format/Auto 16bit")]  static void ChangeTextureFormat_Auto16Bit() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.Automatic16bit);   }    [MenuItem ("Custom/Texture/Change Texture Format/Auto Truecolor")]  static void ChangeTextureFormat_AutoTruecolor() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.AutomaticTruecolor);   }    [MenuItem ("Custom/Texture/Change Texture Format/RGB Compressed DXT1")]  static void ChangeTextureFormat_RGB_DXT1() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.DXT1);   }    [MenuItem ("Custom/Texture/Change Texture Format/RGB Compressed DXT5")]  static void ChangeTextureFormat_RGB_DXT5() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.DXT5);   }    [MenuItem ("Custom/Texture/Change Texture Format/RGB 16 bit")]  static void ChangeTextureFormat_RGB_16bit() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.RGB16);   }    [MenuItem ("Custom/Texture/Change Texture Format/RGB 24 bit")]  static void ChangeTextureFormat_RGB_24bit() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.RGB24);   }    [MenuItem ("Custom/Texture/Change Texture Format/Alpha 8 bit")]  static void ChangeTextureFormat_Alpha_8bit() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.Alpha8);   }    [MenuItem ("Custom/Texture/Change Texture Format/ARGB 16 bit")]  static void ChangeTextureFormat_RGBA_16bit() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.ARGB16);   }    [MenuItem ("Custom/Texture/Change Texture Format/RGBA 32 bit")]  static void ChangeTextureFormat_RGBA_32bit() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.RGBA32);   }    [MenuItem ("Custom/Texture/Change Texture Format/ARGB 32 bit")]  static void ChangeTextureFormat_ARGB_32bit() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.ARGB32);   }    [MenuItem ("Custom/Texture/Change Texture Format/RGB PVRTC 2bit")]  static void ChangeTextureFormat_RGB_PVRTC_2bit() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.PVRTC_RGB2);   }    [MenuItem ("Custom/Texture/Change Texture Format/RGBA PVRTC 2bit")]  static void ChangeTextureFormat_RGBA_PVRTC_2bit() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.PVRTC_RGBA2);   }        [MenuItem ("Custom/Texture/Change Texture Format/RGB PVRTC 4bit")]  static void ChangeTextureFormat_RGB_PVRTC_4bit() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.PVRTC_RGB4);   }    [MenuItem ("Custom/Texture/Change Texture Format/RGBA PVRTC 4bit")]  static void ChangeTextureFormat_RGBA_PVRTC_4bit() {    SelectedChangeTextureFormatSettings(TextureImporterFormat.PVRTC_RGBA4);   }    // ----------------------------------------------------------------------------    [MenuItem ("Custom/Texture/Change Texture Size/Change Max Texture Size/32")]  static void ChangeTextureSize_32() {    SelectedChangeMaxTextureSize(32);   }    [MenuItem ("Custom/Texture/Change Texture Size/Change Max Texture Size/64")]  static void ChangeTextureSize_64() {    SelectedChangeMaxTextureSize(64);   }    [MenuItem ("Custom/Texture/Change Texture Size/Change Max Texture Size/128")]  static void ChangeTextureSize_128() {    SelectedChangeMaxTextureSize(128);   }    [MenuItem ("Custom/Texture/Change Texture Size/Change Max Texture Size/256")]  static void ChangeTextureSize_256() {    SelectedChangeMaxTextureSize(256);   }    [MenuItem ("Custom/Texture/Change Texture Size/Change Max Texture Size/512")]  static void ChangeTextureSize_512() {    SelectedChangeMaxTextureSize(512);   }    [MenuItem ("Custom/Texture/Change Texture Size/Change Max Texture Size/1024")]  static void ChangeTextureSize_1024() {    SelectedChangeMaxTextureSize(1024);   }    [MenuItem ("Custom/Texture/Change Texture Size/Change Max Texture Size/2048")]  static void ChangeTextureSize_2048() {    SelectedChangeMaxTextureSize(2048);   }    // ----------------------------------------------------------------------------    [MenuItem ("Custom/Texture/Change MipMap/Enable MipMap")]  static void ChangeMipMap_On() {    SelectedChangeMimMap(true);   }    [MenuItem ("Custom/Texture/Change MipMap/Disable MipMap")]  static void ChangeMipMap_Off() {    SelectedChangeMimMap(false);   }    // ----------------------------------------------------------------------------      [MenuItem ("Custom/Texture/Change Non Power of 2/None")]  static void ChangeNPOT_None() {    SelectedChangeNonPowerOf2(TextureImporterNPOTScale.None);   }    [MenuItem ("Custom/Texture/Change Non Power of 2/ToNearest")]  static void ChangeNPOT_ToNearest() {    SelectedChangeNonPowerOf2(TextureImporterNPOTScale.ToNearest);   }    [MenuItem ("Custom/Texture/Change Non Power of 2/ToLarger")]  static void ChangeNPOT_ToLarger() {    SelectedChangeNonPowerOf2(TextureImporterNPOTScale.ToLarger);   }    [MenuItem ("Custom/Texture/Change Non Power of 2/ToSmaller")]  static void ChangeNPOT_ToSmaller() {    SelectedChangeNonPowerOf2(TextureImporterNPOTScale.ToSmaller);   }        // ----------------------------------------------------------------------------    [MenuItem ("Custom/Texture/Change Is Readable/Enable")]  static void ChangeIsReadable_Yes() {    SelectedChangeIsReadable(true);   }    [MenuItem ("Custom/Texture/Change Is Readable/Disable")]  static void ChangeIsReadable_No() {    SelectedChangeIsReadable(false);   }    //Unity3D教程手册:www.unitymanual.com    // ----------------------------------------------------------------------------    static void SelectedChangeIsReadable(bool enabled) {        Object[] textures = GetSelectedTextures();    Selection.objects = new Object[0];    foreach (Texture2D texture in textures)  {      string path = AssetDatabase.GetAssetPath(texture);      TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;      textureImporter.isReadable = enabled;          AssetDatabase.ImportAsset(path);     }   }      static void SelectedChangeNonPowerOf2(TextureImporterNPOTScale npot) {        Object[] textures = GetSelectedTextures();    Selection.objects = new Object[0];    foreach (Texture2D texture in textures)  {      string path = AssetDatabase.GetAssetPath(texture);      TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;      textureImporter.npotScale = npot;          AssetDatabase.ImportAsset(path);     }   }    static void SelectedChangeMimMap(bool enabled) {        Object[] textures = GetSelectedTextures();    Selection.objects = new Object[0];    foreach (Texture2D texture in textures)  {      string path = AssetDatabase.GetAssetPath(texture);      TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;      textureImporter.mipmapEnabled = enabled;          AssetDatabase.ImportAsset(path);     }   }  //Unity3D教程手册:www.unitymanual.com  static void SelectedChangeMaxTextureSize(int size) {        Object[] textures = GetSelectedTextures();    Selection.objects = new Object[0];    foreach (Texture2D texture in textures)  {      string path = AssetDatabase.GetAssetPath(texture);      TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;      textureImporter.maxTextureSize = size;        AssetDatabase.ImportAsset(path);     }   }    static void SelectedChangeTextureFormatSettings(TextureImporterFormat newFormat) {        Object[] textures = GetSelectedTextures();    Selection.objects = new Object[0];    foreach (Texture2D texture in textures)  {      string path = AssetDatabase.GetAssetPath(texture);      //Debug.Log("path: " + path);      TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;      textureImporter.textureFormat = newFormat;        AssetDatabase.ImportAsset(path);     }   }    static Object[] GetSelectedTextures()   {    return Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);   } }

     以上代码参考:Unity3d:批量修改贴图导入设置工具脚本

然后,Unity3D界面如下:


在Project窗口中选中需要设置的纹理(可多选),然后点菜单命令执行对应的转换即可。



           

浏览人工智能教程

2015-10-10 14:34:12 u012842807 阅读数 2015

unity3d中材质球纹理的滚动功能可以用来做:流水,墙火 ,履带的滚动等等

一下就是这功能的shader:

Shader "demo/WaterWave" {
Properties {
_WaterTex ("水的纹理图:", 2D) = "white" {}
_XSpeed("XSpeed",Range(-10,10)) = 1 //X轴方向的纹理滚动速度
_YSpeed("YSpeed",Range(0,10)) = 1  //Y轴方向的纹理滚动速度
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _WaterTex;
        fixed _XSpeed;
        fixed _YSpeed;
struct Input {
float2 uv_WaterTex;//注意uv后面的名必须跟你要获取uv值得纹理贴图名字要一样,否则没效果
};
void surf (Input IN, inout SurfaceOutput o) {
   fixed2 UV = IN.uv_WaterTex;   
   fixed xValue = _XSpeed * _Time;//改变u坐标值 _Time为内置变量
   fixed yValue = _YSpeed * _Time;//改变V坐标值   
   UV += fixed2(xValue,yValue);   
half4 c = tex2D(_WaterTex,UV);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG

FallBack "Diffuse"
}



在我们的项目中有些时候想动态的控制材质球里面的XSpeed 和YSpeed的值那么如何获取改变呢?

代码如下:

 GetComponent<Renderer>().material.shader = Shader.Find("Custom/WaterWave");//这里是动态的改变材质的Shader(更换Shader)
        print("x="+GetComponent<Renderer>().material.GetFloat("_XSpeed"));//这里就是读取XSpeed的值 注意引号里面的字符串 是我们Shader 里定义在属性里面的变量
        print("x=" + GetComponent<Renderer>().material.GetFloat("_YSpeed"));
        GetComponent<Renderer>().material.SetFloat("_YSpeed",2);//这里是修改值

Unity3D纹理旋转两种实现方法

博文 来自: xmlyxb
没有更多推荐了,返回首页