首页 > 其他分享 >5.Shading(着色与渲染管线)

5.Shading(着色与渲染管线)

时间:2023-07-01 13:37:35浏览次数:39  
标签:法线 shading 着色 管线 顶点 Shading 向量 vec

着色(shading)

定义

  • 作用于一个物体的材质。
  • 着色不考虑其他物体的存在,所以着色不考虑阴影。

布林冯反射模型Blinn-Phong Reflectance Model

  • 最基础的反射模型
  • Specular highlights(镜面反射)
  • Diffuse reflection(漫反射)
  • Ambient lighting(环境照明)

定义观测基础信息

开展研究前,定义本次观测的基础信息。

  • 法线(垂直于观测点):\(\vec{n}\)
  • 观测方向 :\(\vec{v}\)
  • 光照方向:\(\vec{l}\)
  • 以上都是单位向量

被照射物体光的接收程度

Lambert 余弦定律

  • 物体接收到的能量与射入方向l与观测点的法线夹角有关
  • 物体发生旋转后,接收到的光强度自然发生了变化,\(60^\circ\)接收的光强相比垂直方向少了一半
  • 假设物体单位面积接收到的光强为1
  • 那么单位面积光强为法线方向上的光线强度\(\vec{l}\cdot\vec{n}*1\)

发光物体的光照强度

光能量削弱的过程分析:

  • 假设上图为一个点光源向四面八方发射光,那么在每一层光中,能量都是等量的(球体半径越小,单位面积的能量越高,能量守恒定律)
  • 半径为R的球的表面积计算公式为\(S=4*\pi*R^2\)
  • 假设在近点处(设半径为I)该点能量为I,在远点出能量可推出为\(\frac{I}{r^2}\)。

漫反射Diffuse reflection

  • 红箭头为自然光射入,蓝色箭头为漫反射的效果

\[L_d=k_d(\frac{I}{r^2})max(0,\vec{n}\cdot\vec{l}) \]

  • 知道了物体表面的光强,也知道了发光物体光照强度与距离的关系后就可以分析物体的漫反射情况了
  • 距离光源r的观测平面的光能量为\(\frac{I}{r^2}\)
  • 物体接受的光能力\(max(0,\vec{n}\cdot\vec{l})\)
  • kd表示漫反射能量吸收能力系数,若为0,表示光所有能量都被吸收了,表现为黑色,1表示反射全部的光。
  • 与观测角度v无关,因为漫反射往四面八方反射,能量会均匀分布到四面八方(漫反射的特性)。

高光反射Specular highlights

  • 近似于镜面反射方向上的光。
  • 当光源的镜面反射向量R和观察向量v越接近,人眼就能观察到高光。
布林冯模型中优化了这步判断:

\[L_s=k_s(\frac{I}{r^2})max(0,\vec{n}\cdot\vec{h})^p \]

  • 引入了半程向量\(\vec{h}\),根据平行四边形法则,\(\vec{l}+\vec{v}\)可以获得平行四边形对角线方向的向量
  • 布林冯模型中判断当半程向量\(\vec{h}\)和法线\(\vec{n}\)越接近,那么人眼能观察到的高光就越多
  • 布林冯模型是一个经验形模型,简化了物体表面对于光的吸收程度,主要关注了是否能观察到高光
  • 半程向量的计算比光源的反射向量更好计算,所以通过半程向量与法线来进行判断。
  • 若用反射向量于观测向量来判断是冯模型
  • 指数系数p表示,在一定的角度后就看不到高光了,给与一定系数后会比较符合实际效果。
  • 系数变大后,当角度大于30°后就为0,人眼就看不到高光了,符合实际效果。

  • ks和p的关系效果图。

环境光Ambient lighting

  • 假设某点的环境光从四面八方过来,接受到的强度是一致的。
  • 跟射入向量l无关。不管从哪个角度看都是一样的,跟观测角度无关。

  • La:环境光
  • ka:环境光的系数
  • Ia:表示某点接受到的环境光是一致的,不变的(为了简化)

三种光结合

\[L=L_a+L_d+L_s\\=k_aI_a+k_d(\frac{I}{r^2})max(0,n\cdot l)+k_s(\frac{I}{r^2})max(0,n\cdot h)^p \]


着色频率(Shading Frequencise)

什么造成了三个球的区别?

答:着色频率不同产生的不同

  1. 着色到一个一个面上,每一个面有固定的法线,每一个面做一个次着色。
  2. 着色到一个一个三角形顶点上,三角形内部颜色运用插值获得。
  3. 着色到一个一个每个像素上。

平面着色(FLat shading)

  • 面裁成一个个三角形,对每个三角形获得其法向量(两条向量做叉积)
  • 再根据入射光向量l和观测向量v,等系数获得shading,对每一个三角形shading处理

顶点着色(Gouraud shading)

  • 每一个顶点求出法线向量,再根据入射光向量l和观测向量v,等系数获得shading
  • 由每一个顶点组成三角形,在三角形内部插值获得颜色,获得如下图。

冯着色(Phong shading)

  • 每一个顶点求出法线向量,顶点间构建出三角形
  • 三角形内每个像素插值出独特的法线法相,对每个像素单独shading。
  • 不是布林冯着色,一个是着色模型,一个是着色频率

三者的区别

  • 当模型变得复杂(面数变多),逐面着色不见得比逐像素着色来的差,甚至对于复杂模型来说,逐面着色计算量更小。

问题:怎么求顶点法向量?

  • 假如模型正好是一个球形,那么法线向量就是从圆心到顶点的方向。
  • 但是一般的模型没有那么理想。大佬们就提出一个想法:
  • 某个顶点的法线向量=该顶点所相关的平面向量的加权(与平面的面积相关)平均数

问题:怎么求三角形内部像素的法线呢?

(假设已经通过顶点获取到顶点向量并且连成三角形)

  • 重心坐标(暂时不展开讲解)

渲染管线(Graphics Pipeline OR Real-time Rendering)

  • 着色流程可以发生在顶点处理部分(Vertex Processing),也可以发生在片面处理部分(Fragment Processing)
  • 这取决于选择什么渲染技术,引入了可编程渲染管线

Shader

  • 控制任意片段、顶点、像素如何操作和展示。
  • shader只控制一个片段或者顶点或者像素。
  • 一个网页在线编写shader:http://shadertoy.com/view/ld3Gz2

标签:法线,shading,着色,管线,顶点,Shading,向量,vec
From: https://www.cnblogs.com/oOLzYOo/p/17519155.html

相关文章

  • 6.Shading(纹理映射、其他应用))
    纹理映射在物体的不同位置定义不同的属性,用来定义点的不同属性(例如漫反射系数)把地球仪表面的“皮”,剪开平铺就是一个平面。所以说任意三维物体的表面摊开就是二维平面。纹理映射座标在美术人员建模时,通常会在建模软件中利用纹理展开技术把纹理映射座标(texture-mapping......
  • 记录--Threejs-着色器实现一个水波纹
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助hree.js是一个基于WebGL的JavaScript3D库,用于创建和渲染3D图形场景。一、图像渲染过程1、webGLwebGL:WebGL是一种基于JavaScriptAPI的图形库,它允许在浏览器中进行高性能的3D图形渲染。webGL的......
  • Games101-Cp3-Shading
    Shading的过程就是对物体应用材质的过程。Shading\(\not=\)Shadow。着色模型不包括阴影。Z-Buffering深度缓存用于做深度测试时对深度进行比较。在\([0,1]\)之间取值。应该是可视范围与深度的相除?在开启深度测试的时候,与深度缓存进行比较。如果小于对应像素的深度值则绘制。B......
  • 1145.二叉树着色游戏
    问题描述1145.二叉树着色游戏解题思路贪心策略:对二号玩家来说,想要取胜,选择染色节点只有三种可能:选择x的父节点,则通过深度优先搜索可以求得红色节点数,蓝色节点数为$n$减去红色节点数选择x的左子节点,则通过dfs可以求得蓝色节点数,红色节点数为$n$减去蓝色节点数选择x的右子节......
  • OSG 使用整理(4):使用普通纹理着色
    osg中使用普通纹理着色1.1  普通纹理osg::Image类存储OpenGL纹理对象载入与使用的图像数据,其中方法data()将原始图像数据作为uchar*指针返回,可以直接修改内存中数据,方法getPixelFormat方法返回像素格式,getDataType返回每个像素通道数据类型,方法allocateImage为图片预先分配......
  • Shading-JDBC使用实例
    Sharding-JDBC是一个开源的数据库中间件,用于实现数据库分片和读写分离。它通过在应用程序和底层数据库之间添加一个透明的中间层来实现数据分片和路由。下面是一个简单的示例,展示了如何在Java应用程序中使用Sharding-JDBC:添加依赖项:在您的项目的构建文件(例如pom.xml)中,添加Shard......
  • UE 卡通着色 卡通描边
    前言本篇基于UnrealEngine4CelShadingTutorial|Kodeco教程进行一个总结和实现卡通着色描绘色带与写实风格不同,卡通渲染的色带(阴影,中间调,高光)呈现多段式分布描绘色带的方法最常用的方法是比较表面normal朝向和光照方向根据点成结果即可实现多段色带,若大......
  • 渲染管线导论(龙书笔记)
    渲染管线总体流程InputAssembler(IA)->VSShader(VS)->HullShader(HS)->TessellatorStage->DomainShader(DS)->GeometryShader(GS)->[StreamOutput(SO)]->Rasterizer(RS)->PixelShader(PS)->OutputMerget(OM)输入(图元)装配->......
  • 如何向顶点着色器传颜色?
    stringvs=@"#version330layout(location=og_positionVertexLocation)invec4position;uniformmat4og_modelViewPerspectiveMatrix;voidmain()......
  • 图的m着色问题-回溯法-深度搜索
    问题描述:给定无向连通图G=(V,E)和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中相邻的两个顶点有不同的颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的两个顶点着不同颜色,则称这个数m为该图的色数。......