shader篇-程序纹理


  • shader篇-程序纹理

    • 简介
    • 脚本

简介

程序纹理指的是那些由计算机生成的图像。使用程序纹理的好处在于能创建个性化的图案或真实的自然元素,并可以使用各种参数控制纹理的外观,从而得到丰富的动画和视觉效果。

脚本

脚本创建

using UnityEngine;
using System.Collections;
using System.Collections.Generic;//[ExecuteInEditMode]是为让脚本能在编辑器模式下运行
[ExecuteInEditMode]
public class ProceduralTextureGeneration : MonoBehaviour {

声明材质

//这个材质将使用脚本生成的程序纹理
public Material material = null;

声明程序纹理使用的各种参数
这里使用了一个开源插件SetProperty,可以在修改属性时执行set函数。

#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

在start函数中进行相应检查,以得到需要使用该程序纹理的材质

void Start () {if (material == null) {Renderer renderer = gameObject.GetComponent<Renderer>();if (renderer == null) {Debug.LogWarning("Cannot find a renderer.");return;}material = renderer.sharedMaterial;}_UpdateMaterial();
}

生成程序纹理并赋给材质(材质的_MainTex属性)

private void _UpdateMaterial() {if (material != null) {m_generatedTexture = _GenerateProceduralTexture();material.SetTexture("_MainTex", m_generatedTexture);}}
private Texture2D _GenerateProceduralTexture() {Texture2D proceduralTexture = new Texture2D(textureWidth, textureWidth);// 圆间距float circleInterval = textureWidth / 4.0f;float radius = textureWidth / 10.0f;//模糊系数float edgeBlur = 1.0f / blurFactor;for (int w = 0; w < textureWidth; w++) {for (int h = 0; h < textureWidth; h++) {Color pixel = backgroundColor;// Draw nine circles one by onefor (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {//计算圆心位置Vector2 circleCenter = new Vector2(circleInterval * (i + 1), circleInterval * (j + 1));//计算像素与圆心的距离float dist = Vector2.Distance(new Vector2(w, h), circleCenter) - radius;// 模糊圆边界Color color = _MixColor(circleColor, new Color(pixel.r, pixel.g, pixel.b, 0.0f), Mathf.SmoothStep(0f, 1.0f, dist * edgeBlur));// 混合颜色pixel = _MixColor(pixel, color, color.a);}}proceduralTexture.SetPixel(w, h, pixel);}}proceduralTexture.Apply();return proceduralTexture;
}

shader篇-程序纹理相关推荐

  1. (十七)unity shader之——————高级纹理之程序纹理

    程序纹理指的是由那些计算机生成的图像,我们通常使用一些特定的算法来创建个性化图案或非常真实的自然元素,例如木头.石子等.使用程序纹理的好处在于我们可以使用各种参数来控制纹理的外观,而这些属性不仅仅是那 ...

  2. Unity Shader总结(十)——Cubemap、镜子、玻璃、程序纹理

    文章目录 天空盒 创建立方体纹理 环境映射 反射 折射 菲涅尔反射 渲染纹理(RenderTexture) 镜子效果 玻璃效果 渲染纹理和GrabPass的不同 程序纹理 程序材质 Cubemap是环 ...

  3. Unity shader Note :高级纹理(CubeMap反射折射菲涅尔,Rendermap镜子玻璃,程序纹理)

    1.Cubemap–反射折射 使用脚本来创建Cubemap ①通过Camera.RenderToCubemap 把任意位置观察到的场景图制作成一张Cubemap之中 ②脚本使用自定义编译窗体的命令 – ...

  4. UnityShader21:程序纹理

    一.程序纹理 程序纹理顾名思义就是代码生成的纹理,好了到此就是程序纹理的全部介绍了-- 再细一点讲:假设我们想生成一个下面这样的纹理(白色背景,9给黄色圆圈等距排列),对应的伪代码就为 定义圆的半径A ...

  5. Real-Time Rendering——6.3 Procedural Texturing程序纹理

    Given a texture-space location, performing an image lookup is one way of generating texture values. ...

  6. 着色器编程_unity中的基础纹理,使用Unity Shader实现基础纹理的渲染效果

    学习通过使用Unity Shader实现基础纹理的渲染效果 目录 学习通过使用Unity Shader实现基础纹理的渲染效果 问1:详细描述一下漫反射纹理.高度纹理.法线纹理.渐变纹理和遮罩纹理? 问 ...

  7. UnityShader学习——程序纹理

    文章目录 什么是程序纹理 生成程序纹理 程序材质 什么是程序纹理 程序纹理(Procedural Texture)指的是那些由计算机生成的图像,我们通常使用一些特定的算法来创建个性化图案或非常真实的自 ...

  8. linux一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书)

    一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书) --------------------------目录-网络无关篇-目录-------------------------- 0001 修 ...

  9. 程序纹理应用之静态纹理生成

      自然界的自然现象均是连续的,如山脉.花纹.烟雾.流水:自然界又是分形的,宏观与微观具有几何相似性:自然界的自然现象还具有流畅的变化特征.用传统的图形学来描绘一些自然现象,如火焰.流水.烟雾,存在很 ...

  10. UnityShader入门精要——程序纹理

    程序纹理(Procedural Texture)指的是那些由计算机生成的图像,我们通常使用一些特定的算法来创建个性化图案或非常真实的自然元素,例如木头.石子等.使用程序纹理的好处在于我们可以使用各种参 ...

最新文章

  1. POJ-1430 Binary Stirling Numbers 组合数学
  2. Handler消息机制(一):Linux的epoll机制
  3. ARM架构和ARM核区别和联系
  4. 安卓代码拉下来编译后怎么运行_支付宝秒开是因为用了方舟编译器?官方回应...
  5. Python IDLE(shell清屏配置方法)
  6. java.lang.NoClassDefFoundError: javax/transaction/Synchronization (jUnit测试报错)
  7. Linux虚拟机的替代品:Docker与WSL2上手笔记
  8. adb server is out of date. linux,adb server is out of date. killing完美解决
  9. 开发者论坛一周精粹(第四十七期)服务器变更已备案域名需要重新备案吗?
  10. 云上安全工作乱如麻,等保2.0来一下
  11. 基于JAVA+Spring+MYSQL的码头船只出行管理系统
  12. Oracle 扼杀 Java EE!
  13. Glide 4.x之请求网络图片数据流程解析
  14. IRF(智能弹性架构)
  15. matlab pid buck,基于MATLAB的BUCK电路设计与PID闭环仿真
  16. 密码技术---分组密码的模式
  17. python递归解压文件_递归调用解压zip包或rar包
  18. Linux常用命令及解析
  19. vue3 + element plus 使用el-button焦点问题 失焦操作
  20. 莫辞更坐弹一曲,为君翻作《琵琶行》——python文件I\O

热门文章

  1. jwplayer +ffmpeg+red5 实现摄像头的直播
  2. 程序化交易入门(一)
  3. 利用ansys计算机械结构最小安全系数教程,安全系数
  4. 安装双系统/误删导致原来的引导分区中的boot丢失的解决方案
  5. software_reporter_tool 进程关闭的优雅法子
  6. 服务器CPU占用率过高问题分析
  7. 浅谈数据库用户表结构设计和第三方登录
  8. linux找不到安装命令,linux命令行为什么输入sudo ./configure提示找不到命令
  9. 标注的尺寸避让lisp_AutoCAD中尺寸公差的自动标注 一短小AutoLISP程序轻松实现.doc...
  10. python中上标星号怎么打_Python中参数前加星号的用法