赞
踩
程序纹理指的是指那些用计算生的成的图像,通常使用一些特定的算法来创建个性化图案。其实就是把图像计算完成后再过赋予材质做显示。下面用一个简单的例子来说明,程序计算生成一个主图后赋予_MainTex直接以漫反射形式显示。
CS部分代码:
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
-
- [ExecuteInEditMode]
- public class ProceduralTextureGeneration : MonoBehaviour {
-
- public Material material = null;
-
- #region Material properties
- [SerializeField, SetProperty("textureWidth")]
- private int m_textureWidth = 512;
- public int textureWidth {
- get {
- return m_textureWidth;
- }
- set {
- m_textureWidth = value;
- _UpdateMaterial();
- }
- }
-
- [SerializeField, SetProperty("backgroundColor")]
- private Color m_backgroundColor = Color.white;
- public Color backgroundColor {
- get {
- return m_backgroundColor;
- }
- set {
- m_backgroundColor = value;
- _UpdateMaterial();
- }
- }
-
- [SerializeField, SetProperty("circleColor")]
- private Color m_circleColor = Color.yellow;
- public Color circleColor {
- get {
- return m_circleColor;
- }
- set {
- m_circleColor = value;
- _UpdateMaterial();
- }
- }
-
- [SerializeField, SetProperty("blurFactor")]
- private float m_blurFactor = 2.0f;
- public float blurFactor {
- get {
- return m_blurFactor;
- }
- set {
- m_blurFactor = value;
- _UpdateMaterial();
- }
- }
- #endregion
-
- private Texture2D m_generatedTexture = null;
-
- // Use this for initialization
- void Start () {
- if (material == null) {
- Renderer renderer = gameObject.GetComponent<Renderer>();
- if (renderer == null) {
- Debug.LogWarning("Cannot find a renderer.");
- return;
- }
-
- material = renderer.sharedMaterial;
- }
-
- _UpdateMaterial();
- }
-
- private void _UpdateMaterial() {
- if (material != null) {
- m_generatedTexture = _GenerateProceduralTexture();
- material.SetTexture("_MainTex", m_generatedTexture);
- }
- }
-
- private Color _MixColor(Color color0, Color color1, float mixFactor) {
- Color mixColor = Color.white;
- mixColor.r = Mathf.Lerp(color0.r, color1.r, mixFactor);
- mixColor.g = Mathf.Lerp(color0.g, color1.g, mixFactor);
- mixColor.b = Mathf.Lerp(color0.b, color1.b, mixFactor);
- mixColor.a = Mathf.Lerp(color0.a, color1.a, mixFactor);
- return mixColor;
- }
-
- private Texture2D _GenerateProceduralTexture() {
- Texture2D proceduralTexture = new Texture2D(textureWidth, textureWidth);
-
- // The interval between circles
- float circleInterval = textureWidth / 4.0f;
- // The radius of circles
- float radius = textureWidth / 10.0f;
- // The blur factor
- float edgeBlur = 1.0f / blurFactor;
-
- for (int w = 0; w < textureWidth; w++) {
- for (int h = 0; h < textureWidth; h++) {
- // Initalize the pixel with background color
- Color pixel = backgroundColor;
-
- // Draw nine circles one by one
- for (int i = 0; i < 3; i++) {
- for (int j = 0; j < 3; j++) {
- // Compute the center of current circle
- Vector2 circleCenter = new Vector2(circleInterval * (i + 1), circleInterval * (j + 1));
-
- // Compute the distance between the pixel and the center
- float dist = Vector2.Distance(new Vector2(w, h), circleCenter) - radius;
-
- // Blur the edge of the circle
- Color color = _MixColor(circleColor, new Color(pixel.r, pixel.g, pixel.b, 0.0f), Mathf.SmoothStep(0f, 1.0f, dist * edgeBlur));
-
- // Mix the current color with the previous color
- pixel = _MixColor(pixel, color, color.a);
- }
- }
-
- proceduralTexture.SetPixel(w, h, pixel);
- }
- }
-
- proceduralTexture.Apply();
-
- return proceduralTexture;
- }
- }
Shader部分代码:
- Shader "Custom/TestShader23" {
- Properties {
- _Color ("Color Tint", Color) = (1, 1, 1, 1)
- _MainTex ("Main Tex", 2D) = "white" {}
- _Specular ("Specular", Color) = (1, 1, 1, 1)
- _Gloss ("Gloss", Range(8.0, 256)) = 20
- }
- SubShader {
- Pass {
- Tags { "LightMode"="ForwardBase" }
-
- CGPROGRAM
-
- #pragma vertex vert
- #pragma fragment frag
-
- #include "Lighting.cginc"
-
- fixed4 _Color;
- sampler2D _MainTex;
- float4 _MainTex_ST;
- fixed4 _Specular;
- float _Gloss;
-
- struct a2v {
- float4 vertex : POSITION;
- float3 normal : NORMAL;
- float4 texcoord : TEXCOORD0;
- };
-
- struct v2f {
- float4 pos : SV_POSITION;
- float3 worldNormal : TEXCOORD0;
- float3 worldPos : TEXCOORD1;
- float2 uv : TEXCOORD2;
- };
-
- v2f vert(a2v v) {
- v2f o;
- o.pos = UnityObjectToClipPos(v.vertex);
-
- o.worldNormal = UnityObjectToWorldNormal(v.normal);
-
- o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
-
- o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
- // Or just call the built-in function
- // o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
-
- return o;
- }
-
- fixed4 frag(v2f i) : SV_Target {
- fixed3 worldNormal = normalize(i.worldNormal);
- fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
-
- // Use the texture to sample the diffuse color
- fixed3 albedo = tex2D(_MainTex, i.uv).rgb * _Color.rgb;
-
- fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
-
- fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
-
- fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
- fixed3 halfDir = normalize(worldLightDir + viewDir);
- fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);
-
- return fixed4(ambient + diffuse + specular, 1.0);
- }
-
- ENDCG
- }
- }
- FallBack "Specular"
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。