CG语言 基本光照渲染

Cg语言学习笔记(1) Cg是NVIDIA和微软共同开发的为可编程图形硬件设计的语言。它与OPENGL API和微软 DirectX的HLSL都兼容。 阅读详情

本人新人一枚,想要将自己所学分享给大家,如有错误或不足请大家毫不犹豫的指出,谢谢大家的支持!!!那么开始吧:

一个物体我们能看见是通过被光线照亮后经过反射进入我们的眼睛后大脑成像。计算机(GPU)就是计算进入眼睛之前的各个步骤得到的从而给我们反馈一个结果。

计算公式:SurfaceColor=emissive+ambient+diffuse+specular+...;

SurfaceColor-物体最终渲染结果;

emissive-放射;

ambient-环境放射;

diffuse-漫反射;

specular-镜面反射;

...-其他数据或自定义数据;

注:一个简单的光照渲染中emissive(放射)和specular(镜面反射)和...(其他数据或自定义数据)不是必须的。


上面的公式看着复杂,其实都是一些很简单的运算,接下来我们一个个的分析探讨:

1>emissive  放射

放射简单来讲就是物体发光,可以当做自发光,比如灯泡之类的。

emissive=Ka ——ka表示材质的放射光颜色



2>ambient  环境反射

环境反射简单讲就是反射的从四面八方来的环境中的光

ambient=Kb*globleAmbient——Kb是材质环境反射系数,globleAmbient是入射环境光颜色。



3>diffuse 漫反射

漫反射就是对于表面凹凸不平的物体对于光的反射,比如沥青路面,黑板表面等等。

diffuse=Kc*lightColor*max(N*L,0)——Kc是材质漫反射颜色,lightColor是入射光的颜色,N是归一化的表面法向量,L是归一化的指向光源的向量。其中N*L是N向量点乘L向量。

注:归一化是将向量变成单位向量,也就是说此向量我们不需要其大小仅仅需要其方向进行计算。归一化也有叫规范化。




4>specular 镜面反射

这个好理解,就是类似于镜子中的光反射,但是看到镜子中物体到底有什么取决于观察者的位置,位置不同看到镜子中物体也不同,可以简单理解为美术中的高光。多用于光泽度比较大的物体,例如抛光金属等。

specular=Kd*lightColor*facing*(max(N*H),0)^Mglass——Kd是材质的镜面反射颜色,lightColor是入射镜面反射光颜色,N是归一化法向量,V是指向视点的归一化向量,L是指向光源的归一化向量,H是V向量和L向量的中间向量,Mglass是材质的光泽度。其中N*H是N向量点乘H向量。



好了基本原理讲解完了剩下就是码cg代码了;

cg语言中有两种着色器,顶点着色器和片元着色器。顶点和片元着色器中的代码搞明白其中一个就行,另一个就是粘贴复制,一样的原理,两者就是着色效果会有一点点区别,一般如果物体顶点少的话用顶点着色器会看出物体的三角面,采用片元着色器会好一点。顶点越多线性插值越丰富颜色过度越好,但相对消耗性能。

代码基于Unity3d 2017.3.of3 版本渲染:


Shader "Custom/DiffuseVertexLevelMat"//逐顶点光照
{
Properties
{
_DiffuseColor("DiffuseColor",Color)=(1,1,1,1)
_DiffuseValueRange("_DiffuseValueRange",Range(-5,5))=0.0
_SpecularColor("SpecularColor",Color)= (1,1,1,1)
_Gloss("GlossValue",Range(0.0,256))=20

}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100


Pass
{
Tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag


#include "UnityCG.cginc"
#include "Lighting.cginc"


struct appdata
{
float4 vertex : POSITION;
float3 normal:NORMAL;
};


struct v2f
{
float4 vertex : SV_POSITION;
fixed3 normal : NORMAL;
fixed3 color : COLOR;
};



fixed4 _DiffuseColor;
float _DiffuseValueRange;
fixed4 _SpecularColor;
float _Gloss;

v2f vert (appdata v)
{
v2f o;
//o.vertex = mul(UNITY_MARIX_MVP,v.vertex);//这种写法和下面的写法效果和功能一样,下面的UnityObjectToClipPos()是对mul()的封装
o.vertex = UnityObjectToClipPos(v.vertex);


/*
*计算环境反射
*/
o.normal= (fixed3)normalize(mul(v.normal, (float3x3)unity_WorldToObject));
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//环境反射


/*
*计算漫反射
*/
fixed3 worldNormal =(fixed3) normalize(mul(v.normal, (float3x3)unity_WorldToObject));//世界坐标系下的法线
fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);//世界坐标系下的灯光向量
fixed3 diffuse = _LightColor0.rgb*_DiffuseColor.rgb*max(dot(worldNormal, worldLight),_DiffuseValueRange);//漫发射,其中_DiffuseValueRange可以替换成0


/*
*计算镜面反射
*/
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz-mul(unity_ObjectToWorld,v.vertex).xyz);
fixed3 reflectDir = normalize(reflect(-worldLight,worldNormal));
fixed3 specular = _LightColor0.rgb*_SpecularColor.rgb*pow(saturate(dot(reflectDir, viewDir)), _Gloss);//镜面反射



o.color = ambient + diffuse+ specular;

return o;
}

fixed4 frag (v2f i) : SV_Target
{
fixed4 color = (fixed4)(i.color,1.0);
return fixed4(i.color, 1.0);
}
ENDCG
}
}
}







注:如果这里添加自发光只是会显示颜色,并不会真正意义上变亮,只是简单地光照渲染所以没有给出。



参考文献:Cg教程——可编程实时图形权威指南 Randima Fernando&Mark  J.Kilgard 人民邮电出版社 2004年9月第1版

    unityShader入门精要 冯乐乐 人民邮电出版社 2016年6月第1版


Phong光照模型、Blinn-phong光照模型归纳 <br /><br />NND总算考完试了。。。而且前几天还和季老一起研究开发个2D伪游戏引擎,所以光照模型这块一直没看,这会儿把最后两个经验模型总结一下,权当复习了,然后就开始看高级光照模型。。<br /> <br /> <br />上次说到Lambert漫反射光照模型,这是一个用来模拟粗糙表面对光线的漫反射现象的经验模型,对于纸张、粗糙墙壁等等来说,这个模型或许够用,但对于金属这样的光滑表面来说,我们就需要使用Phong模型来模拟光滑表面对光线的镜面反射现象。同Lambert一样,这个模型也是经验模型, 阅读详情

相关推荐

unity渲染管线及升级URP

unity渲染管线及升级URP一,unity渲染管线简介二,通用渲染管线URP三,shader升级URP1,Builtin RP和URP中内置Shader 的对应2,总体结构3,include4,光照模式LightMode5,变体Variants6,预定义宏辅助宏阴影贴图纹理采样器声明光照、雾7,辅助函数变换函数通用辅助函数向前渲染函数屏幕空间顶点光照深度其他7,内置变量8,后处理参考资料 一,unity渲染管线简介 Unity引擎的渲染管线主要分为"渲染核心库"与"渲染策略"两个部分, “渲染核心库”是U

噗噗噗的博客 1万+

CG之基本光照模型计算公式

参考资料:https://www.cnblogs.com/jietian331/p/5549889.html 在一个基本模型里,一个物体表面的颜色是由放射(emissive)、环境反射(ambient)、漫反射(diffuse)和镜面反射(specular)等光照作用的总和。 每种光照作用取决于表面材质的性质(如亮度和材质颜色)和光源的性质(如光的颜色和位置)的共同作用。 从数学上描述基

zolin7的专栏 1658

光照渲染模型

本文主要介绍基于物理绘制(Physical Based Rendering)的相关背景,以及现有的经典局部光照模型。文中相关描述主要从文末参考文献收集整理而来,仅供自己学习领会~~~。   1光与物质交互:吸收,散射,自发光 直观理解:颜色越深,吸收能力越强;浓度越大,散射能力越强,如下图:   1.1光与平面交互产生的两种散射光:反射光,折射光

Ai_ViVi的专栏 1521

实验6 简单光照与材质

1.实验目的: 通过示范代码1,理解简单光照明模型的基本原理与实现; 通过示范代码2和太阳系示范代码,学习与掌握OpenGL光照与材质设置与使用方法。 2.实验内容: 在示范代码1基础上,按以下要求修改: (1) 阅读和修改示范代码中的有关参数,产生不同光照效果,观察显示效果。挑选两张修改的效果图保存为图1-2,与对应修改的代码一起保存至word实验文档中(15分钟); (2) 将代码中的球体...

图形学与可视化 2173

Unity中Cg编程实战教程

Shader是一段运行在图形处理单元(GPU)上的小程序,它负责处理图形渲染管线中特定的渲染任务。在实时渲染的场景中,比如视频游戏或者VR应用,Shader用于定义材质属性、光照效果、阴影生成以及纹理映射等。Shader的主要作用体现在以下几点:控制顶点处理:通过顶点Shader(Vertex Shader)可以控制顶点的位置、颜色等属性。定义像素处理:片元Shader(Fragment Shader)用于决定每个像素的颜色值。光照和阴影。

weixin_33239721的博客 1218

从DC到DCG:手把手教你搭建物理感知综合流程(含DEF文件处理避坑指南)

本文详细介绍了从Design Compiler(DC)过渡到DC Topographical(DCT)和DC Graphical(DCG)的完整操作框架,特别针对DEF文件处理提供避坑方案。通过环境准备、工具升级、DEF文件处理、DCG综合配置等步骤,帮助开发者高效应对28nm以下工艺节点的物理感知综合挑战,显著提升时序收敛效率。

weixin_27966471的博客 381

NVIDIA CG语言 函数之所有数学类函数(Mathematical Functions)

数学类函数(Mathematical Functions) abs(x) 返回标量和向量x的绝对值 如果x是向量,则返回每一个成员的绝对值 acos(x) 返回标量和向量x的反余弦 x的范围是[-1,1],返回值的范围是[0,π], 如果x是向量,则返回每一个成员的反余弦 all(x) 如果一个布...

weixin_30448685的博客 330

CG_Lession 1

struct CGStruct{ CGparameter modelViewProj ; CGparameter modelViewInverse ; CGparameter globalAmbient ; CGparameter lightColor ; CGparameter lightPosition ; CGparameter eyePosition ; CGparameter Ke ; 

Never fall behind 843

基于FPGA的工业相机项目大赏1——cmos线阵相机

●CMOS CL0402 作为图像传感芯片,曝光后产生一定格式的图像数据;●FPGA ZYNQ7020 作为主控芯片负责cmos驱动控制、图像像素的采集、cmos寄存器的配置、cameralink协议的实现、上位机串口通信的实现;●Cameralink端子实现图像数据的高速串行发送,将数据传送至采集卡PC端。系统工作流程如下: FPGA 上电加载配置程序,计算机通过异步串口向 FPGA 发送控制信息,FPGA对接收的控制信息进行分析判断。

weixin_41895751的博客 6400

C# 操作Excel的时候,出现"被呼叫方拒绝接受呼叫的异常"的解决方案(参考官方给出的解决方案)

首先官方有对这个错误给出解释和解决方案,连接如下: https://docs.microsoft.com/zh-cn/previous-versions/ms228772(v=vs.120)#%E5%8F%AF%E9%9D%A0%E7%BC%96%E7%A8%8B 简单来说,貌似是线程问题,我猜。。。 之前我尝试着在代码中添加 Thread.Sleep(1000); 来进行解决,这种办...

Ck_Max的博客 5768

obj模型

这篇文章给大家讲Obj模型里一些基本功能的完善,包含Cg着色语言,矩阵转换,光照,多重纹理,法线贴图的运用.   在上篇中,我们用GLSL实现了基本的phong光照,这里用Cg着色语言来实现另一钟Blinn-phong光照模型,平常我们说语言只是手段,关键是怎么运用,这个用在如一些高级编程语言上,我们或多或少有不同想法,但是在着色语言上,我认为太对了.因语法都是基于C,C++来的,并且去除很多高

xuexiaokkk的博客 4265

【unity小技巧】常用的方法属性和技巧汇总(长期更新,2025/07/02更新)

Unity开发技巧摘要 本文汇总了Unity开发中的实用技巧,包括移动控制、力应用、物体翻转、单例模式实现等。移动方面介绍了MoveTowards、MovePosition、Translate等方法的区别与应用场景;力应用部分详解了AddForce系列方法的参数和使用方式;物体翻转对比了三种实现方案;单例模式提供了标准实现和泛型优化版本;还收录了绝对值计算、鼠标检测、旋转控制、数值取整等实用代码片段。这些经过验证的技巧能有效提升开发效率,文章将持续更新补充新的实用内容。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3348

【Unity Shader学习】Shader学习笔记01

1.Fixed function shader:属于固定渲染管线Shader,用于高级Shader在老显卡无法显示时的情况下,使用的是ShaderLab语言。 2.Shader包含的文件在Unity中后缀为.cginc。(放在CgIncludes文件夹下) 3.PassDef有三种形态:固定管线、可编程Shader、SufaceShader 4.CG语言与HLSL语言大体上一致,通常使用CG...

凡心所向,素履以往 231

2021.02.23丨Virsorter2安装使用及答疑

最近项目比较多,又在学英语,写文章的时间少了很多。最近接到一个病毒组装的项目。用之前组装工具(ABYSS、SPAdes)都没有能够组装较为完整的scafford,今天介绍一款专门用于组装病毒的工具——Virsorter。 Virsorter最早版本发布于2015年,目前已经有了第二个版本。主要用于病毒的组装的注释。详细情况可以查看文章:https://peerj.com/articles/985/ 安装流程 安装文档: https://github.com/jiarong/VirSorter2/b

4835

从数字后端角度谈谈occ电路(二)

从图中,我们可以清晰的看出,当scan_en为1时,test mode为1时,经过一系列逻辑单元后,得到clk_sel输出信号为1,同样可推算fast_clk_en = 0,slow_clk_en为1,此时clk_out输出为slow clk,符合我们预期。在该模式下,是使用slow clock进行scan shift,接着我们开始进行推导;从图中,我们根据逻辑运算可以看出,clk_sel输出信号为0,fast clk en为1,此时通过mux选择,clk out即为fast clk;

芯冰乐 358

Unity3D 开发之shader教程(浅谈GPU渲染之shader language概述)

尊重他人智慧成果,欢迎转载,请注明作者 心若透明 地址  http://www.cnblogs.com/ubanck/p/4110618.html   在上一篇博客里,大致讲解了一下3D渲染的原理,即从一个简单的模型到渲染到屏幕的过程!其中提到了重要的坐标变换方式,说的不够清楚!今天来谈谈shader语言的执行过程     从硬件上讲,GPU内部有顶点着色器与片段着色器,

1225

10款AI工具赋能虚拟展厅设计:架构师效率提升90%的秘密武器

2020年全球疫情成为数字转型的催化剂,虚拟展厅从"可选项"迅速转变为"必需品"。根据Gartner最新报告,到2025年,超过70%的企业将采用虚拟展厅作为客户体验和产品展示的核心渠道。这一转变不仅是应急措施,更是商业模式的永久性革新。虚拟展厅突破了物理空间的限制——一个精心设计的虚拟展厅可以同时接待来自全球各地的访客,无需考虑场地容量;展品可以以数字形式永久保存,避免了物流和损耗问题;数据分析功能可以精确追踪每位访客的行为轨迹,提供前所未有的洞察。数据透视。

AI 领航者的博客 1573

Unity3D — Shader 顶点片段着色器

表面着色器:复杂、灵活度⾼、⽤到CG 语义绑定 顶点的模型坐标 float4 POSITION 顶点的屏幕坐标 float4 SV_POSTION 顶点法线向量坐标 float3 NORMAL 第⼀个UV坐标 float4 TEXCOORD0 第⼆个…第四个UV坐标 float4 TEXCOORD1…3 顶点切线向量坐标 float4 TENGENT 顶点颜⾊值 float4 COLO 示例代码 示例1 Shader "Zhongdudu/nine" { Properties {

weixin_44098711的博客 615

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

GPU实现“Blinn-Phong 光照模型”(Cg语言)

摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”   9.4 Blinn-Phong光照模型Blinn-Phong光照模型,又称为Blinn-phong反射模型(Blinn–Phong reflection model

liu_lin_xm的专栏 4345

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

基于GPU实现的经典光照模型算法:漫反射模型(使用cg语言实现)

  摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”  第9章 经典光照模型(illumination model)天地开辟 日月重光 ---司马懿,征东辽歌<v:line id="_x0000_s1

liu_lin_xm的专栏 3141

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

CG渲染概念

1.渲染Render *把3D变为2D的过程,指用软件从模型生成图像的过程。模型是用严格定义的语言或者数据结构对于三维物体的描述,它包括几何、视点、纹理以及照明信息。 *首先定位摄像机的位置(四个默认的摄像机:顶视图、正视图、侧视图和透视图),我们大多数时候渲染的是透视图,透视图的摄像机基本遵循真实摄像机的原理。 *然后处理空间感:处理遮挡关系、计算光源、计算阴影、根据物体的材质来计算物...

s729193140的博客 4650

Unity中Cg的基本语法和使用

Cg是类似于C语言的发展起来的图形编程语言,Cgraphics,它的很多表达式if...else...和C语言非常相像,也和C#非常相像。 由于Shader是写给显卡执行的,所以没有输出语句来调试,很多地方调试不了,只能靠Unity编辑器来帮我们报错,写起来一定要小心谨慎。 基本类型表达式 1:语法和C语言类是,有对应的编译器,程序是给显卡运行; 2: 可以从渲染流水线中获得对应...

真像大白阿的博客 2858

Cg基本语法

基本类型表达式1.语法和C语言类似,有对应的编译器,程序是给显卡运行;2.可以从渲染流水线中获得对应的输入;3.指定的输出能流入到下一个流水线模块;4.操作符号和C语言一样,可以使用+,-,*,/,&lt;,&gt;,&lt;=,&gt;=等运算;5.Cg提供了floathalf double 浮点类型;6.Cg支持定点数fixed来高效处理某些小数;7.Cg使用int来表示整数;8.bool数据...

zolin7的专栏 2292

GPU编程与CG语言之阳春白雪下里巴人

CG的数据结构 结构体: <1.如果结构体的一个成员函数使用了成员变量,则该成员变量要声明在前. <2.语义类型( Binding Semantics),所谓绑定语义类型是为了与宿主环境进行数据交换的时候识别不同数据类型的 <3.类型转换 类型转换可以是强制类型转换,也可以是隐式转换,如果是后者,则数据类型从低精度向高精度转换。 float a = 1.0; hal...

qq_35433081的博客 2361
下一篇: OpenGL+VS2017 环境配置(亲测好使)::附带必要知识点
FuXiii
博客等级 码龄9年 89粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值