Unity中Shader编译目标级别

news2024/11/17 11:28:35

文章目录

  • 前言
  • 一、Shader Model
  • 二、Shader编译目标级别
    • 法1: #pragma target 3.0
    • 法2:#pragma require integers geometry
  • 三、测试代码


前言

针对不同平台的特性,所做的一些功能


一、Shader Model

  • ShaderModel 由微软提出,要求显卡厂商按 SM 级别提供对应的功能与指令支持
  • 不同的SM包含不同的指令集与Shader规范
  • 高版本的SM时低版本的超集
  • 微软Shader帮助文档

二、Shader编译目标级别

法1: #pragma target 3.0

Shader编绎目标级别,默认值为2.5
可以通过#if (SHADER_TARGET < 30)来做分支判断
● 2.0:
● 2.5: derivatives
● 3.0: 2.5 + interpolators10 + samplelod + fragcoord
● 3.5(相当于OpenGL ES3.0): 3.0 + interpolators15 + mrt4 + integers + 2darray + instancing
● 4.0: 3.5 + geometry
● 4.5(相当于OpenGL ES3.1): 3.5 + compute + randomwrite
● 4.6: 4.0 + cubearray + tesshw + tessellation
● 5.0: 4.0 + compute + randomwrite + tesshw + tessellation

  • #pragma target怎么用?
    可以结合 CGINCLUDE 来实现多个 SubShader 共用 一个 CG 代码段

  • 1、把CGPROGRAM中需要共用的代码,移入CGINCLUDE 内

 CGINCLUDE
    #include "UnityCG.cginc"
    struct appdata
    {
        float4 vertex : POSITION;
        float2 uv : TEXCOORD0;
    };

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


    v2f vert(appdata v)
    {
        v2f o;
        o.vertex = UnityObjectToClipPos(v.vertex);
        return o;
    }

    fixed4 frag(v2f i) : SV_Target
    {
        return 1;
    }
    ENDCG
  • 2、写出 高配 和 低配 对应的 SubShader
//高配
    SubShader
    {
        Tags
        {
            "RenderType"="Opaque"
        }
        LOD 600

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 3.0
            ENDCG
        }
    }
    //低配
    SubShader
    {
        Tags
        {
            "RenderType"="Opaque"
        }
        LOD 200

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 2.0
            ENDCG
        }
    }
  • 3、在 CGINCLUDE 的代码块中,使用 SHADER_TARGET 来判断不同配置(target 2.0 对应 SHADER_TARGET = 20,其他以此类推)

fixed4 frag(v2f i) : SV_Target
{
#if (SHADER_TARGET < 30)
//低配返回黑色
return 0;
#else
//高配返回 白色
return 1;
#endif
}

  • 4、然后,在场景中使用我们之前使用的 ShaderLOD C# 控制脚本来改变 LOD 看看效果
  • Unity中Shader的ShaderLOD

请添加图片描述

法2:#pragma require integers geometry

表明shader需要的特性功能
● interpolators10: 至少支持10个插值器(从顶点到片断)
● interpolators15: 至少支持15个插值器(从顶点到片断)
● interpolators32: 至少支持32个插值器(从顶点到片断)
● mrt4: 至少支持4个Multiple Render Targets
● mrt8: 至少支持8个Multiple Render Targets
● derivatives: 片断着色器支持偏导函数(ddx/ddy)
● samplelod: 纹理LOD采样
● fragcoord: 将像素的位置(XY为屏幕上的坐标,ZW为齐次裁剪空间下的深度)传入到片断着色器中
● integers: 支持真正的整数类型,包括位/移位操作
● 2darray: 2D纹理数组
● cubearray: Cubemap纹理数组
● instancing: GPU实例化
● geometry: 几何着色器
● compute: Compute Shader
● randomwrite: 可以编写任意位置的一些纹理和缓冲区 (UAV,unordered access views)
● tesshw: GPU支持硬件的tessellation
● tessellation: Tessellation hull/domain Shader
● msaatex: 能够访问多采样纹理
● framebufferfetch: 主要用于在延迟渲染中减少采样的带宽消耗


三、测试代码

Shader "MyShader/P2_3_3"
{
    CGINCLUDE
    #include "UnityCG.cginc"
    struct appdata
    {
        float4 vertex : POSITION;
        float2 uv : TEXCOORD0;
    };

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


    v2f vert(appdata v)
    {
        v2f o;
        o.vertex = UnityObjectToClipPos(v.vertex);
        return o;
    }

    fixed4 frag(v2f i) : SV_Target
    {
        #if (SHADER_TARGET < 30)
            return 0;
        #else
            return 1;
        #endif
    }
    ENDCG

    //高配
    SubShader
    {
        Tags
        {
            "RenderType"="Opaque"
        }
        LOD 400

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 3.0
            ENDCG
        }
    }
    //低配
    SubShader
    {
        Tags
        {
            "RenderType"="Opaque"
        }
        LOD 200

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 2.0
            ENDCG
        }
    }
}

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

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

相关文章

【LeetCode】栈和队列OJ题---C语言版

栈和队列OJ题 1.括号匹配问题&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路表述&#xff1a;&#xff08;3&#xff09;代码实现&#xff1a; 2.用队列实现栈&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路表述&…

java double类型保留两位小数并去除后面多余的0

public static void main(String[] args) {double value9.100001;//保留两位小数String format String.format("%.2f", value);//去除多余的0String strValue new BigDecimal(format).stripTrailingZeros().toPlainString();System.out.println("strValue &q…

三维模型重建中地面控制点刺点输入常见问题及解决方法

三维模型重建中地面控制点刺点输入常见问题及解决方法 在倾斜摄影三维模型重建中&#xff0c;地面控制点的人工刺点输入是一个重要的环节。然而&#xff0c;这个过程可能会遇到一些常见问题。以下是一些常见问题及相应的解决方法&#xff1a; 1、问题&#xff1a;标定点位置不…

48、Flink DataStream API 编程指南(1)- DataStream 入门示例

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

webpack优化打包速度

webpack打包速度太慢 优化 1.多线程打包 js压缩和loader 2.优化启动速度 hard-source-webpack-plugin 3.删除无用的 分析类插件 4.DllPlugin通道打包 1.webpack多线程打包 loader loader 使用 thread-loader 将他放置你要使用的loader前面就行&#xff0c;不过这个lorder例如s…

第二证券:股票几点到几点开盘?

作为股民或许投资者&#xff0c;我们都知道股票是每天都有开盘和收盘时间的。但是&#xff0c;关于股票的开盘时间&#xff0c;很多人并不是很清楚&#xff0c;特别是初学者。在本文中&#xff0c;我们将从多个视点分析股票开盘时间&#xff0c;并为大家供给一些有用的信息。 …

Pytorch从零开始实战11

Pytorch从零开始实战——ResNet-50V2算法实战 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——ResNet-50V2算法实战环境准备数据集模型选择开始训练可视化总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pyt…

Thread的基础用法

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构&#xff0c;mysql&#xff0c;数据结构&#xff0c;javaee等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&…

竞赛云平台助力华东空管局远程知识竞赛

民航华东空管局“安康杯”第三届机关综合管理能力大赛采取远程线上方式进行&#xff0c;所有选手均不在同一个地方&#xff0c;不仅节省了成本&#xff0c;同时也大大简化了赛事组织工作。借助“赛易”这样的线上知识竞赛云平台&#xff0c;其实线上竞赛可以办得象线下一样高端…

Linux学习笔记 CenOS6.3 yum No package xxx available

环境CenOS [roothncuc ~]# cat /etc/issue CentOS release 6.2 (Final) Kernel \r on an \m安装gcc的时候提示没有包 [roothncuc ~]# sudo yum install gcc gcc-c libstdc-devel Loaded plugins: refresh-packagekit, security Setting up Install Process No package gcc a…

《PFL》论文阅读笔记

一、概要 随着联邦学习的发展&#xff0c;简单的聚合算法已经不在有效。但复杂的聚合算法使得联邦学习训练时间出现新的瓶颈。本文提出了并行联邦学习&#xff08;parallel federated learning&#xff0c;PFL&#xff09;&#xff0c;通过调换中心节点聚合和广播的顺序。本文…

行业研究:2023年氟化钾发展前景及细分市场分析

氟化工产品&#xff0c;作为化工新材料之一&#xff0c;在“十二五”规划被单列一个专项规划。由于产品具有高性能、高附加值&#xff0c;氟化 工产业被称为黄金产业。 氟是一种盐&#xff0c;有一种叫做钾的腐化盐&#xff0c;这种产品是白色结晶&#xff0c;易吸收&#xff0…

基于Springboot的房产销售系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的房产销售系统(有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

飞书全新版本搭载AI智能伙伴,支持用户自选底层大模型!

原创 | 文 BFT机器人 近日&#xff0c;字节跳动旗下飞书正式发布“飞书智能伙伴”系列AI产品。此次新产品有专属、易协作、有知识、有记忆、更主动等特点。除此之外&#xff0c;“飞书智能伙伴”作为一个开放的AI服务框架&#xff0c;各企业可根据业务场景自主选择适合的底层大…

图扑软件受邀出席高交会-全球清洁能源创新博览会

“相聚鹏城深圳&#xff0c;共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…

从0开始学习JavaScript--JavaScript 工厂模式

JavaScript 工厂模式是一种强大的设计模式&#xff0c;它提供了一种灵活的方式来创建对象。本文将深入讨论工厂模式的基本概念、多种实现方式以及在实际应用中的各种场景。 工厂模式的基本概念 工厂模式旨在通过一个函数或方法来创建对象&#xff0c;而不是通过类直接实例化。…

使用Python脚本实现图片合成PDF功能

目录 一、所需库 二、图片合成PDF的实现过程 三、完整的代码示例 四、注意事项 总结 在Python中&#xff0c;我们可以使用一些强大的库来实现图片合成PDF的功能。这个过程主要包括读取图片文件、将图片按照指定的顺序合并以及生成PDF文件。下面&#xff0c;让我们一起探索…

用Metasploit进行信息收集2

基于FTP协议收集信息 1.查看ftp服务的版本信息 打开metasploit 查看ftp版本的模块&#xff0c;并进入模块 msf6 > search ftp_version msf6 > use auxiliary/scanner/ftp/ftp_version msf6 auxiliary(scanner/ftp/ftp_version) > show options 查看靶机的端口开方情…

switch....case击穿| return 和break的区别

1、我们首先要明白switch..case的语法使用&#xff1a; 执行流程&#xff1a;首先计算switch后面圆括号中表达式的值&#xff0c;然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句…

C语言:用递归的方法求斐波那契数列:1,1,2,3,5,8,……的前40个数

分析&#xff1a; 首先&#xff0c;在代码的起始部分&#xff0c;包含<stdio.h>头文件&#xff0c;这个头文件提供了输入和输出的函数。 然后&#xff0c;定义了四个变量&#xff1a;f、f1、f2和i。f1和f2是斐波那契数列的前两个数字&#xff0c;初始化为1。f是当前计…