shader学习过程3——shader编程语言

2023-10-27

        shader language最初是由汇编语言编写,难度高,入门难。现在由三种高级语言可以编写。

        一 、HLSL

        基于DirectX的High Level Shading Language,简称HLSL。DirectX简称DX,微软的产品。优点:与硬件无关的软件接口,只支持windows平台。

        二、GLSL

        基于OpenGL的OpenGL Shading Language,简称GLSL。优点:与硬件无关的软件接口,最广泛接纳的2D/3D图形API。

缺点,发展迟缓,更新技术少,只支持移动端平台。SGI(美国硅图公司)的产品。

        三、CG

        NVIDIA公司的C for Graphic 简称Cg语言。GLSL与HLSL分别基于OpenGL和Direct3D的接口,两者不能混用,事实上OpenGL和Direct3D一直都是冤家对头,争斗良久。OpenGL在长期发展中积累下的用户群庞大,这些用户胡i选择GLSL学习。GLSL继承了OpenGL的良好移植性,一度在unix等操作系统上独领风骚。但GLSL的语法体系自成一家。微软的HLSL移植性较差,在windows平台上可谓一家独大,这一点在很大程度上限制了HLSL的推广和发展。但是HLSL用于DX的游戏却是深入人心。

                 Cg语言(C for Graphic)是为GPU编程涉及的高级着色器语言,Cg极力保留C语言的大部分语义,并让开发者从硬件细节中解脱出来,Cg同时也由一个高级语言的其他好处,如代码的易重用性,可读性得到提高,编译器代码优化。Cg是一个可以被OpenGL和Direct3D广泛支持的图形处理器编程语言。Cg语言和OpenGL、DirectX并不是同一层次的语言,而是OpenGL和DirectX的上层,即,Cg程序是运行在OpenGL和DirectX标准顶点和像素着色的基础上的。Cg由NVIDIA公司和微软公司相互协作在标准硬件光照语言的语法和语义上达成了一致开发。所以,HLSL和CG其实是一种语言。

            

            学习哪一种语言:如果使用unity做面对安卓和苹果的项目,我们应该选中GLSL的着色器语言,如果有一天项目也需要发布到windows平台或者是Xbox这样的设备上,那么原来写的GLSL代码需要改成HLSL,为了能够避免这样的平台特性,我们可以选择两个平台都支持的CG.  但是我们还有必要学习GLSL 或者HLSL吗?我也很疑惑。。。。。

           unity 里面 CG 跟 HLSL 、GLSL的关系

显卡主要有3个实现商 nv(英伟达) amd intel(英特尔
图形API 实现主要有 pc上 dx, opengl core, vulkan, 移动平台 opengles vulkan Metal
shader 实现主要两个: dx的 hlsl , opengl opengles 的 glsl

nv 为了统一,搞了一个 cg 语法类似hlsl ,但早起只能在nv的卡上跑,现在不知道


        首先ATI系列显卡对OpenGL扩展支持不够,例如我在使用OSG(Open Scene Graphic)开源图形引擎时,由于该引擎完全基于OpenGL,导致其上编写的3D仿真程序在较老的显卡上常常出现纹理无法显示的问题。其次GLSL 的语法体系自成一家,而HLSL和Cg语言的语法基本相同,这就意味着,只要学习HLSL和Cg中的任何一种,就等同于学习了两种语言。不过OpenGL 毕竟图形API的曾经领袖,通常介绍OpenGL都会附加上一句“事实上的工业标准”,所以在其长期发展中积累下的用户群庞大,这些用户当然会选择 GLSL学习。此外,GLSL继承了OpenGL的良好移植性,一度在unix等操作系统上独领风骚(已是曾经的往事)。

            微软的HLSL移植性较差,在windows平台上可谓一家独大,可一出自己的院子(还好院子够大),就是落地凤凰不如鸡。这一点在很大程度上限制了 HLSL的推广和发展。目前HLSL多半都是用于游戏领域。我可以负责任的断言,在Shader language领域,HLSL可以凭借微软的老本成为割据一方的诸侯,但,决不可能成为君临天下的霸主。这和微软现在的局面很像,就是一个被带刺鲜花簇拥着的大财主,富贵已极,寸步难行。

上面两个大佬打的很热烈,在这种情况下可以用一句俗话来形容,“鹬蚌相争,渔翁得利”。NVIDIA是现在当之无愧的显卡之王(尤其在AMD兼并ATI之后),是GPU编程理论的奠基者,GeForce系列显卡早已深入人心,它推出的Cg语言已经取得了巨大的成功,生生形成了三足鼎立之势。NVIDIA公司深通广告之道,目前最流行的GPU编程精粹一书就出自该公司,书中不但介绍了大量的GPU前沿知识,最重要的是大部分都用Cg语言实现。凭借该系列的书籍,NVIDIA不光确定了在青年学子间的学术地位,而且成功的推广了Cg语言。使用Cg语言的理由:

    其一,Cg是一个可以被OpenGL和Direct3D广泛支持的图形处理器编程语言。 Cg语言和OpenGL、DirectX并不是同一层次的语言,而是OpenGL和DirectX的上层,即,Cg程序是运行在OpenGL和 DirectX标准顶点和像素着色的基础上的;

    其二,Cg语言是Microsoft和NVIDIA相互协作在标准硬件光照语言的语法和语义上达成了一致,文献[1]在1.3.1节的标题就是 “Microsoft and NVIDIA’s Collaboration to Develop Cg and HLSL”,所以,HLSL和Cg其实是同一种语言(参见Cg教程_可编程实时图形权威指南29页的致谢部分)。很多时候,你会发现用HLSL写的代码可以直接当中Cg代码使用。也就是说,cg基于知识联盟(Microsoft和NVIDIA),且拥有跨平台性,选择cg语言是大势所趋。有心的读者,可以注意市面上当前的GPU编程方面的书籍,大都是基于CG语言的。(附:Microsoft和NVIDIA联手推出Cg,应该是一种经济和技术上的双赢,通过这种方式联手打击GLSL)

    此外,Cg,即C for graphics,用于图形的C语言,这其实说明了当时设计人员的一个初衷,就是“让基于图形硬件的编程变得和C语言编程一样方便,自由”。正如C++和 Java的语法是基于C的,cg语言本身也是基于C语言的。如果您使用过C、C++、Java其中任意一个,那么Cg的语法也是比较容易掌握的。Cg语言极力保留了C语言的大部分语义,力图让开发人员从硬件细节中解脱出来,Cg同时拥有高级语言的好处,如代码的易重用性,可读性提高等。使用cg还可以实现动画驱动、通用计算(排序、查找)等功能。

        然后就是unity了
        unity 根据你要跑的不同平台,自动选择了图形API
然后为了统一shader, 自己搞了一个shanderlab, 里面的语法借用了cg
但和nv的cg是两马事
unity 最后会更具你打包的不同平台已经使用的图形API 再把shaderlab的代码生成hlsl或者glsl
unity你选中一个shader,属性窗口里点击gen xxx 可以看到它为不同平台生产单真正shader

     




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

shader学习过程3——shader编程语言 的相关文章

  • 汉诺塔问题(Hanoi)-python递归实现

    描述 描述 一 汉诺塔问题 有三根杆子A B C A杆上有N个 N gt 1 穿孔圆盘 盘的尺寸由下到上依次变小 要求按下列规则将所有圆盘移至C杆 每次只能移动一个圆盘 大盘不能叠在小盘上面 提示 可将圆盘临时置于B杆 也可将从A杆移出的圆
  • idea创建父子项目

    1 先创建父项目 左上角 file gt new gt project 然后选择 点击next Group和Artifact自己填写 Java Version 改成8 Name自己写 其他默认 然后next 这一步是添加依赖 我们只简单测一
  • Jenkins+基础系列16:番外篇--Manage and Assign Roles 角色权限控制插件

    1 下载插件 Role based Authorization Strategy 安装成功后 可以重启下 2 菜单查看 3 菜单简介 4 Manage Roles 设置 5 Assign Roles 设置 6 视图名称和job名称设置 由于
  • R语言 朴素贝叶斯分类预测

    朴素贝叶斯预测分类问题代码 install packages e1071 下载包 library e1071 加载包 classifier naiveBayes iris 1 4 iris 5 构建分类器 table predict cla
  • L1-040. 最佳情侣身高差

    专家通过多组情侣研究数据发现 最佳的情侣身高差遵循着一个公式 女方的身高 1 09 男方的身高 如果符合 你俩的身高差不管是牵手 拥抱 接吻 都是最和谐的差度 下面就请你写个程序 为任意一位用户计算他 她的情侣的最佳身高 输入格式 输入第一
  • JMETER入门_06_jmeter集合点

    JMETER入门系列 JMETER入门 01 环境配置 JMETER入门 02 基础知识介绍 JMETER入门 03 jmeter请求实例 JMETER入门 04 jmeter压力测试实例 JMETER入门 05 jmeter参数管理 ht
  • LeetCode【434】 字符串中的单词数

    题目 统计字符串中的单词个数 这里的单词指的是连续的不是空格的字符 请注意 你可以假定字符串里不包括任何不可打印的字符 示例 输入 Hello my name is John 输出 5 public int countSegments St
  • 深度强化学习系列(16): 从DPG到DDPG算法的原理讲解及tensorflow代码实现

    1 背景知识 在前文系列博客第二篇中讲解了DQN 深度强化学习DQN原理 可以说它是神经网络在强化学习中取得的重大突破 也为强化学习的发展提供了一个方向和基础 Sliver等人将其应用在Atari游戏中取得了重大突破 后来大批量的论文均采用
  • JavaScript 入门基础 - 变量 / 数据类型(二)

    JavaScript 入门基础 变量 数据类型 二 文章目录 JavaScript 入门基础 变量 数据类型 二 1 变量 1 1 什么是变量 1 2 变量在内存中的存储 1 3 变量的使用 1 4 变量语法扩展 1 4 1 更新变量 1
  • kettle配置资源库

    kettle 数据库资源库配置 在使用kettle过程中可以配置资源库 将建好的作业和转换都保存在资源库中 下次直接登录就可以看到所有保存的作业和转换 本教程使用kettle v8 2 mysql 5 7 24做演示 方法 步骤 前期准备工
  • C++五种排序方法(有参考)

    快速排序 堆排序 希尔排序 冒泡排序 选择排序 数据结构选择 数组 概要设计 定义一个容量为一亿个整数的数组 定义变量n 用rand函数生成n个随机数 并赋值给数组 用clock函数计算排序所用时间 编写排序函数和主函数 一 快速排序 in
  • gmpy2常见函数使用

    gmpy2常见函数使用 1 初始化大整数 import gmpy2 gmpy2 mpz 909090 result mpz 909090 2 求大整数a b的最大公因数 import gmpy2 gmpy2 gcd 6 18 result
  • 【Python_PySide2学习笔记(十三)】QMainWindow 和 QWidget 的区别(转载)

    QMainWindow 和 QWidget 的区别 转载 前言 此篇文章中介绍QMainWindow 和 QWidget 的区别 转载自 pyside2 系列之QMainWindow和QWidget 正文 1 QWidget QWidget
  • 多模数据库

    随着业务数据量不断增长的同时 数据结构也变得越来越灵活多样 数据不再局限于规整的结构化数据 半结构化 非结构化数据在数据域处理中的占比逐年上升 因此对不同模态的数据进行智能化数据处理的需求越来越迫切 中国信通院在数据库发展研究报告 2021
  • 算法通关村-----海量数据的处理方法

    从40亿中产生一个不存在的数 问题描述 给定一个文件 包含40亿个非负整数 请你设计一个算法 产生一个不在该文件中的数字 假设你只有1GB内存 问题分析 40亿整数 在java中 用int存储的话 大概需要40亿 4B 大约16G 现在只有
  • [Python知识图谱] 四.Python和Gephi实现中国知网合作关系知识图谱

    该系列文章主要讲解知识图谱或关系图谱的构建方法 前文介绍了Neo4j图数据库和Jieba PyLTP的基本用法 本篇文章主要采用Python和Gephi构建中国知网某个领域的作者合作关系和主题词共现的知识图谱 重点阐述了一种可操作的关系图谱
  • 数据库元数据metadata获取

    数据库元数据metadata获取 项目需求 SQL语句获取数据库元数据信息 JdbcTemplate获取metadata元数据信息 使用java原生的jdbc获取metadata元数据信息 JdbcTemplate执行SQL语句 获取met
  • java学习之线程3与反射

    线程 Daemon 守护线程 该方法必须在启动线程前调用 主线程结束时 子线程也结束 join 插队 哪个线程调用这个方法 就会拿到CPU的执行权 先完成执行 分析 在多线程程序中 这个单例安全吗 为什么 如何解决 加锁来保证同一时间只有一
  • Error response from daemon: Get “https://registry-1.docker.io/v2/“: net/ttp: request canceled while

    在用docker容器运行hello world时出现报错 Error response from daemon Get https registry 1 docker io v2 net ttp request canceled while

随机推荐

  • condition_variable 条件变量

    文章目录 条件变量 头文件 condition variable 公共方法 wait wait Lck 流程图 示例 错误示例 等待前通知 导致无法获得通知 wait Lck Pred 流程图 示例 等待后通知 示例 等待前通知 错误示例
  • Shell全局变量、局部变量与特殊变量笔记总结

    变量类型 全局变量 环境变量 和局部变量 本地变量 环境变量可以在定义它们的shell及其派生出来的任意子进程的shell中使用 局部变量只能在定义它们的函数 脚本中使用 还有一些变量是用户创建的 其他的则是专用的shell变量 1 全局变
  • 执行ajax的步骤即封装

    一 执行AJAX 1 四个步骤 step1 获取核心对象 step2 设置发送请求地址 step3 发送请求 请求数据 step4 接受相应数据 业务处理 1 1 step1 获取核心对象 判断window中是否有在网页加载后与服务器进行通
  • FFmpeg常用滤镜

    常用的滤镜中重点的是 scale trim overlay yadif rotate movie 比如常用的scale 可以用来做缩放 trim可以做比较精确的帧级的剪切 overlay可以来实现视频混流 画中画或多画面等叠加处理 rota
  • 子类能不能继承父类的构造函数

    一 子类能继承父类的构造函数 答案是不能的 构造函数是创建对象时完成时数据的初始化 当我们在new一个对象并传入参数时 会自动调用有参数的构造完成参数的初始化 也就是属性的初始化 试想子类中继承父类的构造方法 不仅不符合构造方法的命名规则
  • Mysql查找当前数据库端口

    默认端口为3306 也可以执行以下命令查询 show global variables like port
  • 点云 3D 目标检测 - RangeDet(ICCV 2021)

    点云 3D 目标检测 RangeDet In Defense of Range View for LiDAR based 3D Object Detection 基于LiDAR的3D目标检测的距离视图防御 ICCV 2021 摘要 1 引言
  • 学嵌入式 - 第一天

    一 了解 虚拟机 中的终端 键盘按下 CTRL ALT T 三个键打开终端 加入终端界面我们会看到如下界面 hgj ubuntu 是命令提示符提示你输入命令 hgj 表示的是用户名 是分隔符 ubuntu 是主机名 是分隔符 是当前工作路径
  • BES2300x笔记(0) -- 学习笔记索引

    博文索引 一篇文章带你搞定BES平台 提供全网最全的开发调试笔记和文档下载 持续更新 BES2300x笔记 1 SDK代码架构与Battery模块 BES2300x笔记 2 如何区分左右耳 BES2300x笔记 3 编写自动化编译脚本 BE
  • 操作系统--进程同步

    进程同步 进程同步概念 进程互斥的软件实现方法 单标志法 双标志先检查 双标志后检查 Peterson 算法 进程互斥的硬件实现方法 中断屏蔽方法 TestAndSet指令 Swap指令 信号量机制 整形信号量 记录型信号量 用信号量实现进
  • Vue页面的import

    前提 components文件夹下有translateform和translateoutput两个vue文件 如何把translateform vue中的内容引入到app vue中 在app vue中import translateform
  • 【解决】TypeError: Invalid attempt to destructure non-iterable instance.In order to be iterable, non...

    使用uniapp做APP真机调试时 HbuilderX控制台打印如下错误信息 我出现这样问题的原因是因为虚拟绑定了请求的对象属性 在页面加载的时候由于初始化没有数据就会报以上错误 解决办法 提前写好渲染数据的字段就ok了 templateD
  • UML系统分析和设计:用例图

    用例图 1 概述 1992年jacobson提出了用例的概念和可视化表示方法 用例图 作为软件项目开发和规划的一个基本模型元素 所谓用例是指系统的外部事物 活动者 设备或外部系统 与系统的交互 它表达了系统的功能 即系统所提供的服务 用例图
  • python调用百度智能云API请求(以自然语言处理——词法分析为例)

    调用API的思路 获得api的token 按官方文档发送链接 分析返回的结果 步骤一 获取API的token 如果不知道token是啥 或是不知道怎么获取token 请参考 https blog csdn net weixin 357577
  • 智能合约-ERC20接口方法详解

    官方文档 EIP 20 Token Standard 实现Demo https github com ConsenSys Tokens blob fdf687c69d998266a95f15216b1955a4965a0a6d contra
  • Java调用C语言DLL文件方法

    有时候我们经常要在 JAVA中调用C语言DLL文件 下面我们将用一个例题来向大家介绍 JAVA调用C语言DLL文件的实现方法 一 生成C的头文件 1 编辑Main java public class Main public native s
  • 嘴说手画Spark的存储系统

    Spark本身并不存储数据 这里所说的存储系统是指计算过程中 管理内存中数据 如读到内存的源数据 缓存的RDD数据 广播数据 Shuffle文件数据的功能模块 如果没有存储管理系统 计算是无法完成的 存储系统的主要由以下组件构成 Block
  • 建立时间裕量和保持时间裕量

    前面的博客里面有讲解建立时间Tsetup和保持时间Tholdon的概念以及要满足的和时钟之间的关系 这里不再重复 在了解建立时间裕量和保持时间裕量之前我们先来了解一下触发沿Launch Edges 和锁存沿Latch Edges 一般认为L
  • Redis(四)Redis集群搭建

    Redis集群搭建 pwd命令主要用于打印当前工作目录的工作路径 Keepalived Redis服务器的高可用除了用集群和哨兵模式外 还可以用keepalived Keepalived的作用是检测服务器的状态 如果有一台web服务器宕机
  • shader学习过程3——shader编程语言

    shader language最初是由汇编语言编写 难度高 入门难 现在由三种高级语言可以编写 一 HLSL 基于DirectX的High Level Shading Language 简称HLSL DirectX简称DX 微软的产品 优点