(三) 计算机图形学 之 Shader 定义 (顶点 着色器)

2023-11-05

shader : 决定材质 跟灯光的作用。

shader 属性定义的通用格式:

Properties { Property [ Property ... ] } (相当于一个类的公共变量)

Properties
{
    定义一个Int:
    name("display name" , Int) = 1

    定义一个Float:
    name("display name" , Float) = 1.0

    定义一个Range (一个变化范围)
    name("display name" , Range( 1 , 5 ) ) = 2

    定义一个颜色 (4维表示)
    name("display name" , Color) = (1,1,1,1)

    定义一个 4维数组
    name ("display name" ,  Vector ) = (1,1,1,1)

    定义一个纹理 (Texture)
    name ("display name" , 2D ) = "white"{}

    定义一个 CubeMap (6个面的纹理 反射 或 天空盒)
    name ("display name" , Cube ) = "skybox"{TexGen CubeReflect}  //定义一个立方贴图纹理属性

    定义一个3d的纹理
    name ("display name" , 3D ) = ""{}
}


1:name('display name",type)=值;

name:  变量名字, 以下划线开头_Name;
disply name: 共外界 Unity 菜单栏显示
type(int/Float/Range): 变量类型
= 1/1.0/2: 默认值

2:类型:

Float、Int、Color(num,num,num,num)(0~1)、Vector(4维向量)、Range(start,end)
2D:2D纹理属性;
Rect:矩形纹理属性;
Cube:立方体纹理属性;
3D:3D纹理属性;
name("dispalyname",2D) = "name"{options}

3:options:纹理属性选项

TexGen:纹理生成模式,纹理自动生成纹理坐标的模式;顶点shader将会忽略此选项;(模式下包括ObjectLiner、EyeLinear、SphereMap、Cube Reflect CubeNormal)
LightmapMod:光照贴图模式如果设置这个选项,纹理会被渲染器的光线贴图所影响。


3D纹理(限制): 
1.只能用脚本创建
2.opengl3.0 及以上 才支持

Shader能操作的只有以下三部分
一、顶点 着色器:
1. 计算顶点的颜色
2.顶点变换
3.灯光的作用

二 、片段 着色器:
1.纹理采样。(贴纹理)


三。、三大测试:


第一点:SubShader-顶点着色器详细讲解:

1:SubShader{[Tags],[CommonState],Pass{}}
子着色器由标签(Tags),通用状态,通过列表组成,它定义了一个渲染通道列表,并可选为所有通道初始化需要的通用状态;
2:SubShader渲染的时候,将优先渲染一个被每个通道所定义的对象。
3:通道的类型:RegularPass、UsePass、GrabPass。
4:在通道中定义状态同时对整个子着色器可见,那么所有的通道可以共享状态。

SubShader{
    Tags{"Queue","Transparent"}
    Pass{
        Lighting Off // 关闭光照
        ...
    }
}

Tags:

 Tags{"标签1","value1""标签2"="value2"}
标签的类型:
Queue tag:队列标签;
RenderType tag:渲染类型标签;
DisableBatching tag:禁用批处理标签;
ForceNoShadowCasting tag:强制不投影标签;
IgnoreProjecttor tag:忽略投影标签;
CanUseSpriteAtlas tag:使用精灵图集标签;
PreviewType tag:预览类型标签;

Pass:

1.subshader包装了一个渲染方案,这些方案由一个个通道(Pass)来执行的,SubShader可以包括很多通道块,每个Pass都能使几何体渲染一次;
2.Pass基本语法
Pass{[Name and Tags][RenderSetup][Texture Setup]}
Pass块的Name引用此Pass,可以在其他着色器的Pass块中引用它,减少重复操作,Name命令必须大写;

RegularPass 通道类型的渲染设置:

1.Lighting光照:开启关闭定点光照 On/Off
2.Material{材质块}:材质,定义一个使用定点光照管线的材质
3.ColorMaterial:颜色集 计算定点光照时,使用顶点颜色
4.SeparateSpecular:开关状态,开启或关闭帝国点光照相关的镜面高光颜色,On/Off
5.Color 设置顶点光照关闭时,所使用的颜色
6.Fog(雾块):设置雾参数
7.AlphaTest:Alpht测试
8.ZTest:深度测试模式
9.ZWrite:深度写模式
10.Blend:混合模式(SourceBlendMode、DestBlendMode、AlphaSourcesBlendMode、AlphaDstBlendMode)
11.ColorMask 颜色遮罩:设置颜色遮罩,颜色值可以有RGB或A或0或R、G、B、A的组合,设置为0关闭所有颜色通道渲染;
12.Offset 偏移因子:设置深度偏移

UsePass 通道类型的渲染设置(特殊通道):

插入所有来自其他着色器的给定名字的通道;
UsePass“Shader/Name", //Name为着色器通道名称;
UsePass”Specular/BASE" //插入Specular中为BASE的通道;

GrabPass 通道类型的渲染设置(特殊通道):

GrabPass{}:一种特殊通道类型,他会捕获物体所在位置的屏幕内容,并写入一个纹理中,这个纹理能被用于后续通道中完成一些高级图像特效,后续通道可以使用_GrabTexture进行访问。
GrabPass{"纹理名称"}捕获屏幕内容到指定纹理中,后续通道可以通过纹理名称来访问。

Fallback:

1.降级,定义的所有子着色器,都不能运行的话,则会尝试降级;

2.Fallback“着色器名称”

3.Fallback Off,没有降级,并且不会打印任何警告。

Category 分类:

分类是渲染命令的逻辑组。例如着色器可以有多个子着色器,他们都要关闭雾效果可以如下:

Shader “xxx”{

    Category{
        Fog{Mode Off}
        SubShader{...}
        SubShader{...}
    }

}

 

Shader "TestShader/Vertex"
{
    Properties
    {    
        _MainTex("Texture",2D) = "white"()
        _TestColor("Texture",Color) = (0.1.0.1)
    }
    SubShader
    {
        Pass
        {
            //Color(0,1,0,1)
            Color[_TestColor]
            Material
            {
                //Diffuse(1,1,1,1) // 灯光的漫反射与材质如何作用
                Diffuse[_TestColor]
                //环境光设置
                Ambient[_TestColor]
                //高光设置 需要打开高光开关
                Specular[_TestColor]
                //自发光设置
                Emission[_TestColor]
            }
            //高光开关(只对高光起作用)
            SeparateSpecular On
            //灯光总开关(对所有光起作用)
            Lighting On
        }
    }
}


调节 顶点的颜色:
_TestColor("Texture",Color) = (0.1.0.1)
 1. Color(0.1.0.1)
 2. Color[ _TestColor]

shader1.0 灯光计算公式:
Ambient * Lighting Window`s Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission

Ambient: 环境光
Diffuse: 满反射光
Specular: 镜面反射
Emission : 自发光
Light Color: 灯光颜色

第二点:片段着色器详细讲解:


贴纹理原理:
 提问:大小 跟 显示区域不匹配怎么办?(有以下三种情况)
1.纹理 跟显示区域相等  (纹理就是贴图图片,显示区域是要放置材质球的物体 例如Culb)
显示区域 100*100     纹理大小 100*100

2.纹理 大于显示区域
显示区域 100*100    纹理大小 1024*512


处理有两种方法:
方法一、采用 等比例 映射

 

 

UV(坐标系):

方法二、Unity提供的 (贴图菜单里的 Filter Mode选项)
。Point : 就近采样
。Bliinear: 就近 周围 4个像素的平均     (上+中+下+左+右)/5
。Tlilnear: 就近 周围 8个像素的平均      (左上+上+右上+右+右下+下+左下+左+中)/9

3.纹理 小于显示区域
显示区域 100*100   纹理大小 

锯齿: 马赛克:
处理也可用 Unity提供的 Filter Mode选项里的解决该问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(三) 计算机图形学 之 Shader 定义 (顶点 着色器) 的相关文章

随机推荐

  • RK3188上运行Ubuntu系统

    参照 http androtab info radxa rock ubuntu 注意事项 1 不要使用163源 163的源上不带 armhf架构 2 Sdcard使用不了可以使用u盘 这都无所谓 3 最后启动桌面时如果出现 xf86Open
  • stm32F411 SPI3 无输出

    在调试 F411 SPI3 PB3 SPI SCLK PB4 SPI MISO PD6 SPI MOSI PA15 SPI NSS 配置 MOSI MISO SCK 的时候 想当然的把3个管脚 都配置到 GPIO AF6 SPI3 导致MO
  • 第十四届蓝桥杯C++B组题解(不完全对)

    A直接暴力枚举 答案235 include
  • 局域网下别人访问本地运行的vue项目

    背景 仅vue项目 无后台 网上其他教程有修改config目录index js文件的 当前本地vue项目没有config目录 关闭防火墙 进入 防火墙和网络保护 关闭下面三个 启动vue项目 首先下面是我的vue和脚手架版本 启动vue项目
  • python加载模型包_pytorch-保存和加载模型

    简介 pytorch与保存 加载模型有关的常用函数3个 torch save 保存一个序列化的对象到磁盘 使用的是Python的pickle库来实现的 torch load 解序列化一个pickled对象并加载到内存当中 torch nn
  • 简单部署 rancher 管理kubernetes集群(3)

    rancher 简单使用 运行docker 容器 环境部署 关闭防火墙与selinux systemctl stop firewalld systemctl disable firewalld sed i s SELINUX enforci
  • (一)疲劳驾驶检测---OpenCV级联分类器进行目标检测

    1 计算机在检测人脸的过程中实际上是做分类检测 即发现图片中一些像素组成了 眼睛特征 鼻子特征 等 2 如果 眼睛特征 旁边有 鼻子特征 鼻子特征 旁边又有 眼睛特征 着三个元素所在的区域就很有可能就是人脸区域 如果缺少了必要的特征 那么就
  • 四叉树的C++实现

    四叉树的数据结构 抽象数据类型定义如下 ADT QuadTrees 数据对象D D是具有相同性质的具有二维结构的数据元素的集合 本实验为坐标数据 数据关系R 若D为空集 则称为空树 若D仅含有一个数据元素 则R为空集 否则R H H是如下二
  • 使用Python合并PDF文件笔记

    工作中 有多个原理图pdf文件 为了方便查找网标 所以需要把多个pdf文件进行合并 在网上查了以下使用python PyPDF2进行 源码如下 encoding gb18030 import os import PyPDF2 获取当前py文
  • 软件测试实战项目web资讯管理平台—黑马头条测试

    系列文章目录 软件测试功能到自动化学习路线图 2022年最新版技术栈 软件测试01 从了解测试岗位职能和测试流程开始 附作业 软件测试02 6大实际案例手把手教你设计测试点 软件测试03 用例执行以及缺陷管理的学习 附禅道下载使用流程 软件
  • 深入理解SELinux SEAndroid(第一部分)

    按哥的习惯 应该是全部洗剪吹完后再发 不过今年是马年 什么都强调 马上 所以 现在就先奉献 马上有第一部分 祝各位同仁 朋友 马年快乐 深入理解SELinux SEAndroid SEAndroid是Google在Android 4 4上正
  • 快速了解SDK和API的区别

    快速了解SDK和API的区别 SDK 是 Software Development Kit 的缩写 软件开发的工具包 辅助开发某一类软件的相关文档 范例和工具的集合都能叫做SDK SDK被开发出来是为了减少程序员工作量的 如果有公司开发出了
  • conda activate xxx 激活虚拟环境报错

    如果使用 conda activate xxx 激活虚拟环境报以下错误 CommandNotFoundError Your shell has not been properly configured to use conda activa
  • 据说还有比Mybatis Plus好用的ORM框架?还是阿里出的!

    来源 juejin cn post 6886019929519177735 使用fluent mybatis可以不用写具体的xml文件 通过java api可以构造出比较复杂的业务sql语句 做到代码逻辑和sql逻辑的合一 不再需要在Dao
  • Linux系统管理实践(2):OpenSSH远程管理配置

    OpenSSH是SSH Secure SHell 协议的免费开源实现 它用安全 加密的网络连接工具代替了telnet ftp rlogin rsh和rcp工具 OpenSSH支持SSH协议的版本1 3 1 5和2 SSH协议族可以用来进行远
  • 6.5V~65V用于电动自行车/汽车照明的同步降压恒流芯片LN4524

    6 5V 65V用于电动自行车 汽车照明的同步降压恒流芯片LN4524 LN4524 是一款外围电路简单 连续工作模式非隔离式恒流 LED 驱动控制芯片 LN4524 采用了 PWM 工作模式 在应用中可以采用较小值的电感 芯片外置 PMO
  • vivado创建IP时出现IP_Flow 19-3153] Bus Interface ‘user_clk‘: ASSOCIATED_BUSIF bus parameter is missing解决

    我新建IP时 里面添加了一个自己的输入时钟 系统默认给添加到了时钟和复位信号里面了 如下图箭头指示 然后提示 解决办法 其实就是按照其提示给这个信号添加bus parameter ASSOCIATED BUSIF 右键单击上图红色箭头指示的
  • Scrapy中使用Selenium

    Scrapy中使用Selenium可以通过以下步骤实现 1 安装Selenium库 可以通过pip安装selenium库 pip install selenium 2 下载浏览器驱动 Selenium需要浏览器驱动来控制浏览器 可以下载对应
  • Win10 安装系统跳过创建用户,直接启用 Administrator

    oobe 到创建用户那里 第一种方法 按 shift F10 打开 cmd 输入 lusrmgr msc 将 administrator 启用 关闭 lusrmgr msc 回到 cmd 输入 taskmgr exe 打开任务管理器 结束进
  • (三) 计算机图形学 之 Shader 定义 (顶点 着色器)

    shader 决定材质 跟灯光的作用 shader 属性定义的通用格式 Properties Property Property 相当于一个类的公共变量 Properties 定义一个Int name display name Int 1