「游戏引擎 浅入浅出」从零编写游戏引擎教程,是一本开源电子书,PDF/随书代码/资源下载:

https://github.com/ThisisGame/cpp-game-engine-book


4.1 Unity Shader和OpenGL Shader

上一节提到,OpenGL Shader是配套出现的, Vertex Shader(顶点着色器)、Fragment Shader(片段着色器/像素着色器),两者缺一不可。

但是我用了20年Unity都没有见过类似的代码,这是咋回事,Unity跳过OpenGL自己实现了图形库吗?

1. Unity Shader类型

打开Unity,新建Shader。

在Unity中,可以创建4种Shader。

  1. Standard Surface Shader
  2. Unlit Shader
  3. Image Effect Shader
  4. Compute Shader

这4种Shader,是对一套特定功能的Vertex Shader、Fragment Shader组合,取的名字。

以C语言为例,我们编写多个C语言代码,可以编译出各种程序,如收银台程序、聊天程序、游戏程序,每一种程序都针对特定功能。

用编写的Vertex Shader、Fragment Shader,也可以编译得到各种程序,如无光照的GPU程序、有光照的GPU程序、特效程序,每一种程序都针对特定功能。

Unity中可选的4种Shader,每一种都是针对特定功能,每一种都是由不同的Vertex Shader、Fragment Shader组成。

2. Unity Shader代码

上面说,Unity Shader是由Vertex Shader、Fragment Shader组成,那就是说,Unity Shader里面的代码由Vertex Shader、Fragment Shader拼起来咯?

3.绘制简单图形 这一章的配套项目里,ShaderSource.h 就是由 Vertex Shader 和 Fragment Shader 拼起来的,那Unity Shader也是如此吗?

创建一个 Standard Surface Shader,观察代码,发现结构完全不一样,连 入口 main 函数都没有!

Shader "Custom/NewSurfaceShader" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200 CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows // Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0 sampler2D _MainTex; struct Input {
float2 uv_MainTex;
}; half _Glossiness;
half _Metallic;
fixed4 _Color; // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
// #pragma instancing_options assumeuniformscaling
UNITY_INSTANCING_CBUFFER_START(Props)
// put more per-instance properties here
UNITY_INSTANCING_CBUFFER_END void surf (Input IN, inout SurfaceOutputStandard o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}

这是因为,我们在Unity中写的Shader代码,并不是标准的OpenGL Shader,而是NVIDIA开发的Cg语言。

Cg语言可以由工具,转换成OpenGL Shader,或者DX Shader,毕竟Unity是跨平台引擎,如果没有Cg语言,那每一种功能的Shader既要写OpenGL的,又要写DX的,要累死程序员了。

3.Unity Shader转OpenGL Shader

Unity中选中创建的Shader,在Inspector里,打开Shader编译平台设置,修改为 All platforms

点击Compile and show code 将Unity Cg Shader文件转为OpenGL Shader。

转换完成后自动打开,搜索 glcore,定位到转换后的代码。

这就是转换出来的Vertex Shader代码,看到入口 main 函数了。

「游戏引擎 浅入浅出」4.1 Unity Shader和OpenGL Shader的更多相关文章

  1. Flink 反压 浅入浅出

    前言 微信搜[Java3y]关注这个朴实无华的男人,点赞关注是对我最大的支持! 文本已收录至我的GitHub:https://github.com/ZhongFuCheng3y/3y,有300多篇原创 ...

  2. 浅入浅出 1.7和1.8的 HashMap

    前言 HashMap 是我们最最最常用的东西了,它就是我们在大学中学习数据结构的时候,学到的哈希表这种数据结构.面试中,HashMap 的问题也是常客,现在卷到必须答出来了,是必须会的知识. 我在学习 ...

  3. 浅入深出之Java集合框架(上)

    Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...

  4. 浅入深出之Java集合框架(中)

    Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...

  5. 浅入深出之Java集合框架(下)

    Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...

  6. 重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB

    重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.P ...

  7. 『浅入浅出』MySQL 和 InnoDB

    作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系 ...

  8. 『浅入深出』MySQL 中事务的实现

    在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇文章中,我们将对事务的实现进行分析,尝 ...

  9. 浅入浅出EmguCv(三)EmguCv打开指定视频

    打开视频的思路跟打开图片的思路是一样的,只不过视频是由一帧帧图片组成,因此,打开视频的处理程序有一个连续的获取图片并逐帧显示的处理过程.GUI同<浅入浅出EmguCv(二)EmguCv打开指定图 ...

随机推荐

  1. APP应用前端开发

    1.开发手机APP前端要重视meta标签的编写: 2.注意HTML5标签在前端开发中的使用: 3.前端制作要舍弃CSS float属性(可flex布局),用绝对定位不利于页面布局的扩展: 4.APP前 ...

  2. JZ009乘积小于k的子数组

    title: 乘积小于k的子数组 题目描述 题目链接:乘积小于k的子数组.剑指offer009 解题思路 注意: 一开始的乘积k值就是小的,随着右边窗口移动才会不断增大 怎么样的条件才能更新左窗口:当 ...

  3. 在字节跳动,一个更好的企业级SparkSQL Server这么做

    SparkSQL是Spark生态系统中非常重要的组件.面向企业级服务时,SparkSQL存在易用性较差的问题,导致难满足日常的业务开发需求.本文将详细解读,如何通过构建SparkSQL服务器实现使用效 ...

  4. ajax 请求登录超时跳转登录页解决方法

    在Filter里判断是否登录,如果未登录返回401状态 public class SelfOnlyAttribute : ActionFilterAttribute { public override ...

  5. FreeMarker速查手册

    一.开始 原理图 引入FreeMarker依赖 <dependency> <groupId>org.freemarker</groupId> <artifac ...

  6. 118_Power Pivo周维度度同比、环比相关

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 在群里看到有人在交流周维度同环比,同时又好多天都没有更新文章了,最近没有什么好的素材,就硬生生的写一个吧. 先来 ...

  7. iTextSharp 提取签名图像

    原文 本文使用 iTextSharp 5.5.13.2,记录使用 iTextSharp 提取图片时,获得的知识点. pdf 中的签名并不是单纯的一张图片,它是由一张基础的底色图和一张蒙版图片组成.需要 ...

  8. 用 notion 管理信用卡与花呗

    用 notion 管理信用卡与花呗 Notion原文,排版更佳 概述 不需要提醒功能和安卓用户可以忽略Scriptable和快捷指令 app的设置 Notion 建立信用卡表格,录入信用卡基本信息,自 ...

  9. 在vue中路径中的@

    1.在Vue的路径中@等于src 2.在css的路径中~@等于src

  10. 场景实践:基于 IntelliJ IDEA 插件部署微服务应用

    体验简介 阿里云云起实验室提供相关实验资源,点击前往 本场景指导您把微服务应用部署到 SAE 平台: 登陆 SAE 控制台,基于 jar 包创建应用 基于 IntelliJ IDEA 插件更新 SAE ...