Unity Shader中使用GLSL创建材质

news2024/12/23 9:38:25

目录

  • Unity Shader格式
    • Properties
      • 怎么在脚本中使用类似于glUniform()的功能呢?
    • SubShader
      • Tags
      • LOD
      • pass
        • pass内的tags说明
        • pass内的代码段(GLSL)
        • GLSL与CG语言的差异
          • 1. GLSL不可在外部定义结构体
          • 2. 在UnityShader中Uniform可以写在vert frag外面
  • Shader 内置参数(GLSL)
    • GLSLSupport.glslinc
      • 摄像机
      • 输入数据
    • UnityCG.glslinc
      • Time
      • 摄像机和屏幕参数(Unity入门精要 , P88)
        • projection
        • _WorldSpaceCameraPos

Unity Shader格式

Shader "Shader类型/Shader名称" {
 	Properties{//属性 用于ShaderLab与unity界面的通信
 		//_内置变量名 ("unity界面可见的变量名", 属性类型) = 值
 		_Color ("My Color", Color) = (1, 1, 1, .5) 
 	 } 
 	 
 	 //Subshader  shader的解决方案。
 	 //每个shader程序包含至少一个subshader,用于解决硬件性能兼容问题。
 	 //shader的主代码部分都写在这里
 	 Subshader{

 	 }
 }

Properties

可以看作将OpenGL中各个着色器的Uniform做了一次赋值。
即:将外部数据 "unity界面可见的变量名"的值 赋给 _内置变量名
内置变量名需要在GLSL代码内部定义同_内置变量名Uniform参数。

例如:

   Properties{
         _Color("Color",Color) = (1,1,1,1)			//将“Color”定义为Color类型,就可以在Unity界面上以Color类型进行修改
   }
   SubShader{
         Tags{"RenderType" = "Opaque" "Queue" = "Geometry"}
         Pass{
             GLSLPROGRAM

			//.vert代码
             #ifdef VERTEX
				[vert代码...]
             #endif
             
             //.frag代码
             #ifdef FRAGMENT
             
             uniform vec4 _Color;				//在这里定义了_Color
             
             void main() {
                 gl_FragColor = _Color;
             }
             #endif
             
             ENDGLSL
         }
     }

在属性处定义的Color在unity界面上显示
在这里插入图片描述
在Unity界面上修改Color,属性处的定义 就会将该值传递给GPU变量uniform vec4 _Color
在这里插入图片描述
修改后,可以看到界面中的物体材质发生了改变。即:GLSL成功运行并将渲染的结果呈现了出来。

在这里插入图片描述

怎么在脚本中使用类似于glUniform()的功能呢?

Material对象的一系列set方法。比如这里的_Shininess是float,那么,可以写如下一个C#脚本:

public Material mat;
public UISlider slider;
public void OnSliderValueChanged()
{
	mat.SetFloat ("_Shininess", slider.value);//将滑轮的值传给材质
}

void Start()
{
	mat = gameObject.renderer.material;
}

SubShader

Tags

tags可以填写多个命令,可以控制渲染时机。可以通过在unity的asset窗口中点击shader查看tags生效情况。
最常见的Tag就是"RenderType","RenderType" = "Opaque"表明这是一个不透明的物体。而Transparent就表明是透明物体啦。

另外比较有用的标签还有"IgnoreProjector"=“True”(不被Projectors影响),“ForceNoShadowCasting”=“True”(从不产生阴影)以及"Queue"=“xxx”(指定渲染顺序队列)

LOD

细节等级。大家玩吃鸡的时候,从飞机上跳下,这时看到地图上的建筑都是比较粗糙的块,当距离慢慢拉近,建筑模型变得越发精致,这就是LOD技术,根据不同的范围使用不同的模型。shader的LOD也是同样用法,不同细节等级,使用不同的LOD。在Unity的Quality Settings中可以设定最大LOD值,当当前LOD小于shader LOD时,那个sub shader就会失效.

pass

pass是实现着色器具体代码的地方。一个subshader内可以有多个pass。但尽可能用较少的pass实现是对性能的考虑。

pass内的tags说明

pass内的代码段(GLSL)

代码段由GLSLPROGRAM开始,由ENDGLSL结束。
中间使用如下方法定义代码段

#ifdef VERTEX
	[vert代码段]
#endif

#ifdef FRAGMENT
	[frag代码段]
#endif
}

GLSL与CG语言的差异

1. GLSL不可在外部定义结构体
GLSLPROGRAM
      struct a2v {
          vec4 vertex : POSITION;
          vec3 normal : NORMAL;
          vec4 texcoord : TEXCOORD0;
      };
ENDGLSL

报错
error C7557: OpenGL does not allow Cg-style semantics

2. 在UnityShader中Uniform可以写在vert frag外面
uniform vec4 _Color;

#ifdef VERTEX
void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
#endif
#ifdef FRAGMENT

void main() {
    //gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    gl_FragColor = _Color;
}
#endif

Shader 内置参数(GLSL)

GLSLSupport.glslinc

摄像机

uniform mat4 unity_ObjectToWorld;
uniform mat4 unity_WorldToObject;
uniform mat4 unity_MatrixVP;
uniform mat4 unity_MatrixV;
uniform mat4 unity_MatrixInvV;
uniform mat4 glstate_matrix_projection;

  


  uniform mat4 gl_ModelViewMatrix;
  uniform mat4 gl_ProjectionMatrix;
  uniform mat4 gl_ModelViewProjectionMatrix;
  uniform mat4 gl_TextureMatrix[gl_MaxTextureCoords];
  uniform mat3 gl_NormalMatrix; 
     // transpose of the inverse of gl_ModelViewMatrix
  uniform mat4 gl_ModelViewMatrixInverse;
  uniform mat4 gl_ProjectionMatrixInverse;
  uniform mat4 gl_ModelViewProjectionMatrixInverse;
  uniform mat4 gl_TextureMatrixInverse[gl_MaxTextureCoords];
  uniform mat4 gl_ModelViewMatrixTranspose;
  uniform mat4 gl_ProjectionMatrixTranspose;
  uniform mat4 gl_ModelViewProjectionMatrixTranspose;
  uniform mat4 gl_TextureMatrixTranspose[gl_MaxTextureCoords];
  uniform mat4 gl_ModelViewMatrixInverseTranspose;
  uniform mat4 gl_ProjectionMatrixInverseTranspose;
  uniform mat4 gl_ModelViewProjectionMatrixInverseTranspose;
  uniform mat4 gl_TextureMatrixInverseTranspose[gl_MaxTextureCoords];

输入数据

在这里插入图片描述

作者:雄关漫道从头越
链接:https://www.jianshu.com/p/7b1294d5bd2c
来源:简书

UnityCG.glslinc

Time

uniform vec4 _Time;
uniform vec4 _SinTime;
uniform vec4 _CosTime;

摄像机和屏幕参数(Unity入门精要 , P88)

projection

uniform vec4 _ProjectionParams;
  • x: 1或-1(-1表示翻转投影)
  • y:near
  • z:far
  • w:1.0 + 1.0/Far

_WorldSpaceCameraPos

摄像机在世界坐标中的位置

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何处理图片排重(精准排重,相似排重)

图片相似度对比 1、需求 假如有一个图片池,存有1亿图片。给一张目标图片,在图片池中做匹配。 判断一张图片是否在图片池中出现过。(完全一样)判断有没有相似的出现过。比如两张图相似度90,两张图片是在描述一件事情。 …

请推荐几个github上的vue的pc端项目?

前言 这是github上一些高收藏的vue PC端的项目,花了一点时间做了一下vue2和vue3的资源分类整理,可以根据自己的学习进度以及需求来选择对应的项目来研究,希望对你有帮助~ Vue2 PC项目 1、 Elemen Star:53.4k 是一个基于Vue.js…

【Unity Optimize】使用图集(Sprite Atlas)优化项目

目录 1 图集(Sprite Atlas)介绍2 创建与配置Sprite Atlas2.1 创建Sprite Atlas2.1.1 Unity2D项目2.1.2 Unity3D项目 2.2 配置Sprite Atlas2.3 注意事项 3 Sprite Atlas的接口4 Sprite Atlas的优化建议 1 图集(Sprite Atlas)介绍 …

vue3+element plus+vite 引入本地静态资源图片require报错的原因和解决方案,以及如何在表格中展示图片

文章目录 一、vue3element plusvite 引入本地静态资源图片require报错的原因和解决方案二、vue 3element plusvite 项目中,在el-table中展示本地静态图片总结 一、vue3element plusvite 引入本地静态资源图片require报错的原因和解决方案 在写vue3vite项目的过程中…

Java-代码连接数据库生成POJO、Mapper

本文主要介绍如何在IDEA中,编写代码连接数据库生成对应的POJO、Mapper、Service、Controller 文章目录 前言环境搭建代码开发基本配置常量信息代码生成 测试结果 前言 在实际开发中,设计完数据库后,不可避免需要创建数据库表对应的POJO&…

rt-thread汇总

finish和msh的区别? 这个问题我一直没搞懂,可能得看一下源码才能搞清楚了吧 通过Qemu运行RT-Thread 在windows上通过QEMU快速上手RT-thread smart RT-thread启动流程 rt-thread启动流程 Kconfig语法 Kconfig语法 LOG输出 rt_kprintf("Hello …

InsCode AI ,你的良师益友!

Chat-GTP的火爆程度相信大家已经听说了,也对它有一个基本的初识,它是Open AI所研发的,读者当中应该有不少人已经接触和体验人工智能聊天,以及使用它交流很多问题有关于生活,学习等,而 InsCode AI 也一样能够…

javaWeb ssh学堂在线管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh学堂在线管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

30天从入门到精通TensorFlow1.x 第三天,tf.variable_scope()共享或重用变量

tf.variable_scope()共享或重用变量 文章目录 一、接前一天二、tf.variable_scope()共享或重用变量1. 背景2. 目的3. tf.variable_scope()基本参数3. tf.variable_scope()作用(1).命名空间(2).共享变量(3).…

软考A计划-电子商务设计师-电子商务相关技术与应用基础知识

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

cesium 相机相关

1 相机的初始位置 /*** The default rectangle the camera will view on creation.* type Rectangle*/ Camera.DEFAULT_VIEW_RECTANGLE Rectangle.fromDegrees(-95.0,-20.0,-70.0,90.0 );// set default view rectangleCameraPosition3D(this,Camera.DEFAULT_VIEW_RECTANGLE,…

Async 使用详解

Spring Boot异步调用Async 在实际开发中,有时候为了及时处理请求和进行响应,我们可能会多任务同时执行,或者先处理主任务,也就是异步调用,异步调用的实现有很多,例如多线程、定时任务、消息队列等&#xf…

若依框架快速搭建(二)

目录 数据库设计功能模块设计XXX信息管理xxx查询xxx添加xxx删除xxx修改xxx导出 功能模块实现运行数据库自动代码生成在IDEA中找到RuoYi-generator,修改配置运行前后端项目,在网页中找到代码生成模块导入表后点击确定,序号前打勾,再…

Mac - 光标特效 By CursorEffect2

目录 一.引言 二.安装 CursorEffect2 三.使用 CursorEffect2 四.使用效果 五.内存消耗 六.一键关闭 七.总结 一.引言 在自己搭建的 Hexo 博客上可以定义鼠标点击的特效,如图点击后可以产生彩色的斑点。 于是想着除了浏览 Hexo 博客外,能不能别的也…

【笔试强训编程题】Day1.(组队竞赛100449)和(删除公共字符69390)

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训编程题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!! 文章目录…

【CSS3系列】第一章 · CSS3新增的三种基本属性

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

FineBI6.0基础学习第一课 数据门户

PC端门户使用示例 首先,以管理员身份登录FineBI系统,安装数据门户,安装步骤见官网 新建一个数据门户

SouapUI接口测试之创建性能测试

SouapUI也是一个能生动的体现一个系统(项目)性能状态的工具,本篇就来说说如何在SouapUI工具下创建性能测试 一、创建测试用例 由于在《SouapUI接口测试之使用Excel进行参数化》篇已经创建好了测试用例,本篇就不讲解如何创建测试…

SpringCloudAlibaba:服务网关之Gateway学习

目录 一、网关简介 (一)为什么要用网关 (二)网关解决了什么问题 (三)常用的网关 二、Gateway简介 (一)核心概念 (二)工作原理 三、Gateway快速入门 &…

linuxOPS基础_用户与组管理

linux用户与组概念 为什么需要了解用户和组 服务器要添加多账户的作用 ​ 针对不同用户分配不同的权限,不同权限可以限制用户可以访问到的系统资源 ​ 提高系统的安全性 ​ 帮助系统管理员对使用系统的用户进行跟踪 用户和组的关系 理论上Linux系统中的每个用户…