C# shader 生成程序纹理

1、程序纹理是什么

程序纹理(Procedural Textures)就是通过程序代码生成的纹理

2、程序纹理如何生成

一般生成程序纹理由两种方式:

  • 通过C#脚本生成纹理后传递给Shader
  • 直接在Shader代码中自定义逻辑生成纹理

3、程序纹理的好处

程序纹理由于是由程序员写代码动态生成的,因此它具备以下优点:

  • 由于是动态生成,不需要存储大文件,可以在运行时生成任意分辨率的纹理
  • 可以根据需求调整自定义参数,实时的更改纹理外观
  • 通过适当的函数设计,可以生成无缝平铺的纹理

总体而言:程序纹理的最明显好处就是自由度高,可控性强

4、C# 程序生成

生成一个国际象棋棋盘网格,规则是:格子的行列编号同奇同偶则为白色,否则为黑色

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 生成一个国际象棋网格
/// </summary>
public class DynamicGenTex : MonoBehaviour
{
    public int textureWidth = 256;
    public int textureHeight = 256;
    public int tileCount = 8;
    private int pixelPerUnit;
    

    public Color Color1 = Color.white;
    public Color Color2 = Color.black;


    void Start()
    {
        UpdateTexture();
    }

    /// <summary>
    /// 更新纹理
    /// </summary>
    public void UpdateTexture() {
        pixelPerUnit = textureWidth / tileCount;
        Texture2D tex = new Texture2D(textureWidth, textureHeight);

        for (int y = 0; y < textureHeight; y++) {
            for (int x = 0; x < textureWidth; x++) {
                int row = x / pixelPerUnit;
                int col = y / pixelPerUnit;

                if (row % 2 == col % 2) 
                    tex.SetPixel(x, y, Color1);
                else
                    tex.SetPixel(x, y, Color2);
            }
        }
        // 应用像素的变化
        tex.Apply();

        Renderer renderer = this.GetComponent<Renderer>();
        if (renderer != null) {
            renderer.sharedMaterial.mainTexture = tex;
        }
    }
}

但是现在必须在运行时才能看见,所以可以通过自定义Inspector窗口调用函数

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(DynamicGenTex))]
public class DynamicGenTex_Editor : Editor
{
    public override void OnInspectorGUI() {
        base.OnInspectorGUI();

        // 获取目标脚本
        DynamicGenTex obj = (DynamicGenTex)target;
        if (GUILayout.Button("更新程序纹理")) {
            obj.UpdateTexture();
        }

    }
}

5、Shader 生成纹理

Shader "ShaderProj/7/DynamicGenTex"
{
    Properties
    {
       _TileCount ("TileCount", Float) = 8
       _Color1 ("Color1", Color) = (1,1,1,1)
       _Color2 ("Color2", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            float _TileCount;
            float4 _Color1;
            float4 _Color2;

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata_base v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.texcoord;

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float2 uv = i.uv * _TileCount;
                float2 posIndex = floor(uv);
                float value = (posIndex.x + posIndex.y) % 2;

                return lerp(_Color1, _Color2, value);
            }
            ENDCG
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899464.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.1 > Shell 是什么、如何更熟练的使用 Bash Shell

Shell 基础知识 Shell是计算机操作系统中的一个命令行解释器&#xff0c;由C语言编写&#xff0c;用于用户与操作系统之间进行交互。用户可以通过Shell输入命令&#xff0c;操作系统接收到这些命令后执行相应的操作。Shell一般还提供了编程语言的基本功能&#xff0c;允许用户…

梯度累积的隐藏陷阱:Transformer库中梯度累积机制的缺陷与修正

在本地环境下对大规模语言模型&#xff08;LLMs&#xff09;进行微调时&#xff0c;由于GPU显存限制&#xff0c;采用大批量训练通常难以实现。为解决此问题&#xff0c;一般普遍会采用梯度累积技术来模拟较大的批量规模。该方法不同于传统的每批次更新模型权重的方式&#xff…

MacOS RocketMQ安装

MacOS RocketMQ安装 文章目录 MacOS RocketMQ安装一、下载二、安装修改JVM参数启动关闭测试关闭测试测试收发消息运行自带的生产者测试类运行自带的消费者测试类参考博客&#xff1a;https://blog.csdn.net/zhiyikeji/article/details/140911649 一、下载 打开官网&#xff0c;…

A-【项目开发知识管理】Android AIDL跨进程通信

Android AIDL跨进程通信 文章目录 Android AIDL跨进程通信0.我为啥要写这篇文章1.AIDL是干啥的&#xff1f;1.1简述1.2官方话 2.在AndroidStudio中怎么干&#xff1f;2.1准备工作2.2在项目A中创建AIDL文件夹2.3在项目A中创建一个aidl文件2.4将项目A进行一次Rebuild操作2.5在项目…

visual studio设置修改文件字符集方法

该方法来自网文&#xff0c;特此记录备忘。 添加两个组件&#xff0c;分别是Force UTF-8,FileEncoding。 截图如下&#xff1a; 方法如下&#xff1a;vs中点击“扩展”->“管理扩展”&#xff0c;输入utf搜索&#xff0c;安装如下两个插件&#xff0c;然后重启vs&#xf…

【设计模式系列】观察者模式

一、什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。这种模式也被称为发布-订阅模式&…

matplotlib库

1.概念 Matplotlib 库&#xff1a;是一款用于数据可视化的 Python 软件包&#xff0c;支持跨平台运行&#xff0c;它能够根据 NumPy ndarray 数组来绘制 2D 图像&#xff0c;它使用简单、代码清晰易懂 Figure&#xff1a;指整个图形&#xff0c;您可以把它理解成一张画布&…

【含开题报告+文档+PPT+源码】基于vue框架的东升餐饮点餐管理平台的设计与实现

开题报告 在当前信息化社会背景下&#xff0c;餐饮行业正经历着由传统线下服务模式向线上线下深度融合的转变。随着移动互联网技术及大数据应用的飞速发展&#xff0c;用户对于餐饮服务平台的需求也日益多元化和个性化。他们期望能在一个集便捷、高效、个性化于一体的平台上完…

快速搭建SpringBoot3+Prometheus+Grafana

快速搭建SpringBoot3PrometheusGrafana 一、搭建SpringBoot项目 1.1 创建SpringBoot项目 1.2 修改pom文件配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://…

如何使用 Spring Cloud 实现客户端负载平衡

微服务系统通常运行每个服务的多个实例。这是实施弹性所必需的。因此&#xff0c;在这些实例之间分配负载非常重要。执行此操作的组件是负载均衡器。Spring 提供了一个 Spring Cloud Load Balancer 库。在本文中&#xff0c;您将学习如何使用它在 Spring Boot 项目中实现客户端…

SolarWinds Web Help Desk曝出严重漏洞,已遭攻击者利用

近日&#xff0c;CISA 在其 “已知漏洞”&#xff08;KEV&#xff09;目录中增加了三个漏洞&#xff0c;其中一个是 SolarWinds Web Help Desk (WHD) 中的关键硬编码凭据漏洞&#xff0c;供应商已于 2024 年 8 月底修复了该漏洞。 SolarWinds Web Help Desk 是一款 IT 服务台套…

影刀RPA实战番外:excel函数应用指南

Excel函数是用于执行特定计算、分析和数据处理任务的预定义公式。它们可处理数学计算、文本处理、逻辑判断、日期和时间运算、查找和引用数据等。例如&#xff0c;SUM函数可以计算一系列数字的总和&#xff0c;IF函数进行逻辑测试&#xff0c;VLOOKUP函数在表格中查找数据&…

HTML之表单设计

1、HTML表单 HTML表单是用于收集用户输入的信息&#xff0c;并将用户输入的内容信息传到后台服务器中。 表单是通过form标签实现。 特别注意&#xff1a;如果一些内容提交后&#xff0c;没有将内容提交给后台服务器&#xff0c;那么需要添加一个name属性&#xff0c;语法&am…

鼠标移入盒子,盒子跟随鼠标移动

demo效果&#xff1a; 鼠标移入盒子&#xff0c;按下鼠标,开启移动跟随移动模式,再次按下关闭移动模式 涉及主要属性 在元素上单击鼠标按钮时输出鼠标指针的坐标&#xff1a; var x event.pageX; // 获取水平坐标 var y event.pageY; // 获取垂直坐标元素offsetL…

JDK-23与JavaFX配置在IDEA中

一、安装 1.IDEA安装&#xff0c;可以查看CSDN 2.JDK,JavaFX安装&#xff0c;可以查看CSDN 二、配置JDK 打开IDEA&#xff0c;选择个项目&#xff0c;点击图中的设置按钮&#xff1a; 点击项目设置&#xff1a; 点击“”添加JDK&#xff0c;寻找相应的JDK目录就行 三、配置…

Python快速入门教程

目录 1. Python 简介 2. 环境准备 3. 第一个 Python 程序 4. 变量与数据类型 5. 基本操作与控制结构 6. 函数与模块 7. 实践项目 结语 Python 是一种非常友好的编程语言&#xff0c;特别适合初学者。它的语法简洁&#xff0c;容易上手&#xff0c;并且广泛应用于各种领…

机器视觉运动控制一体机在DELTA并联机械手视觉上下料应用

市场应用背景 DELTA并联机械手是由三个相同的支链所组成&#xff0c;每个支链包含一个转动关节和一个移动关节&#xff0c;具有结构紧凑、占地面积小、高速高灵活性等特点&#xff0c;可在有限的空间内进行高效的作业&#xff0c;广泛应用于柔性上下料、包装、分拣、装配等需要…

从docker中导出已经存在的容器

从docker中导出已经存在的容器,作用:创建一个容器可以给多台电脑的docker使用&#xff0c;不用重复安装环境。 操作步骤&#xff1a; (1)先运行要导出的容器&#xff0c;并在cmd终端使用docker ps 查看运行的详细信息&#xff0c;留意一下 COMMAND对应的值后面运行容器需要使用…

创建匿名管道

匿名管道&#xff1a; pipe()函数可用于创建一个管道&#xff0c;以实现进程间的通信。 头文件是#include<unistd.h>&#xff0c;参数是int类型的数组 fd[0]表示读端 fd[1]表示写端 如下代码使用pipe函数创建管道&#xff0c;并打印出来&#xff0c;最后关闭终端。 #…

力扣 简单 70.爬楼梯

文章目录 题目介绍题解 题目介绍 题解 思路分析&#xff1a; 确定dp数组以及下标的含义&#xff1a;dp[i]&#xff1a; 爬到第i层楼梯&#xff0c;有dp[i]种方法确定递推公式&#xff1a;从dp[i]的定义可以看出&#xff0c;dp[i] 可以有两个方向推出来。首先是dp[i - 1]&…