IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Google Filament 源码学习(五):Material System (四) - 材质系统 API -> 正文阅读

[游戏开发]Google Filament 源码学习(五):Material System (四) - 材质系统 API

Shader public APIs

Introduction

?? 将 Shader public APIs小节单独做总结是有必要的,这部分与材质框架代码编写相关。资料依然来自于官方文档:

  • https://github.com/google/filament/tree/main/docs/Materials.html

Types

  • 虽然 GLSL 的变量类型可以直接使用(如vec4 或 mat4),但 Filament 建议使用以下类型别名:(大部分开C++程序员都喜欢这种方式)
名称GLSL 类型
bool2bvec2
bool3bvec3
bool4bvec4
int2ivec2
int3ivec3
int4ivec4
uint2uvec2
uint3uvec3
uint4uvec4
float2float2
float3float3
float4float4
float4×4mat4
float3×3mat3

Math

名称GLSL 类型描述
PIfloat π \pi π
HALF_PIfloat π 2 \cfrac{\pi}{2} 2π?
saturate(float x)float将指定值Clamp到 0.0 和1.0 之间
pow5(float x)float x 5 x^5 x5
sq(float x)float x 2 x^2 x2
max3(float3 v)float返回 float3 中最大的值
mulMat4×4Float3(float4×4 m, float3 v)float4返回 m ? v m * v m?v
mulMat3×3Float3(float4×4 m, float3 v)float4返回 m ? v m * v m?v

Matrices

名称类型描述
getViewFromWorldMatrix()float4×4从世界空间转换为视图空间的矩阵
getWorldFromViewMatrix()float4×4从视图空间转换为世界空间的矩阵
getClipFromViewMatrix()float4×4从视图空间转换为裁剪空间的矩阵
getViewFromClipMatrix()float4×4从裁剪空间转换为视图空间的矩阵
getClipFromWorldMatrix()float4×4从世界转换为裁剪空间的矩阵
getWorldFromClipMatrix()float4×4从裁剪空间转换为世界空间的矩阵

Frame constants

名称类型描述
getResolution()float4视图的分辨率(以像素为单位):宽度、高度、1 /宽度、1 /高度
getWorldCameraPosition()float3camera/eye 在世界空间中的位置
getWorldOffset()float3获得 API 级(API-level)世界空间所需的变换
getTime()float当前时间秒以内的部分。为介于 0 和 1 之间的值
getUserTime()float4当前时间(以秒为单位): time, (double)time - time, 0, 0
getUserTimeMode(float m)float当前时间除余 m(以秒为单位)
getExposure()float相机的曝光量
getEV100()float相机 ISO100 时的曝光量
  • world space
    • 为了获得良好的精度,Filament的着色系统中的"世界空间"不一定与API级别的世界空间相匹配。要获得 API 级像机的位置,自定义材质可以将 getWorldOffset()添加到 getWorldCameraPosition()中。

Vertex only

  • 只在 vertex 块中使用的 API
名称类型描述
getPosition()float4材质定义域中的顶点位置(默认:对象/模型空间)
getCustom0() 到 getCustom7()float4自定义顶点属性 (attribute)
getWorldFromModelMatrix()float4×4从模型(对象)空间转换为世界空间的矩阵
getWorldFromModelNormalMatrix()float3×3将法线从模型(对象)空间转换为世界空间的矩阵
getVertexIndex()int当前顶点的索引

Fragment only

  • 以下 API 只能用于 fragment block
名称类型描述
getWorldTangentFrame()float3×3矩阵在每列中包含世界空间中顶点的 tangent (frame[0]),bi-tangent(frame[1])和 normal (frame[2])。如果材质不计算bump mapping 的切线空间法线,或者渲染不是各向异性的,则在此矩阵中只有法线有效。
getWorldPosition()float3片元在世界空间中的位置
getWorldViewVector()float3世界空间中从片元位置到 eye 的归一化向量
getWorldNormalVector()float3在 bump mapping 之后,世界空间中归一化法线(必须在prepareMaterial() 之后使用)
getWorldGeometricNormalVector()float3在 bump mapping 之前,世界空间中归一化法线(可以在 prepareMaterial() 之前使用)
getWorldReflectedVector()float3view vector 关于法线的反射向量(必须在prepareMaterial() 之后使用)
getNormalizedViewportCoord()float3归一化视口位置 (viewport position)(即NDC坐标归一化为[0,1],可以在 prepareMaterial() 之前使用)
getNdotV()floatdot(normal, view) 的结果,总是严格大于0(必须在prepareMaterial() 之后使用)
getColor()float4片元的插值颜色(如果需要颜色属性)
getUV0()float2UV 坐标,仅当需要 uv0 属性时才可用
getUV1()float2UV 坐标,仅当需要 uv1 属性时才可用
getMaskThreshold()float返回 mask 阈值,仅当混合设置为 masked 时才可用
inverseTonemap(float3)float3将 inverse tone mapping 运算符应用于指定的线性sRGB颜色,并返回一个线性sRGB颜色。此操作可能是一种近似操作,最好与“Filmic” tone mapping 操作符配合使用
inverseTonemapSRGB(float3)float3将 inverse tone mapping 运算符应用于指定的非线性sRGB颜色,并返回线性sRGB颜色。此操作可能是一种近似操作,最好与“Filmic” tone mapping 操作符配合使用
luminance(float3)float计算指定线性 sRGB 颜色的 luminance
ycbcrToRgb(float, float2)float3将 luminance 和 CbCr 对转换为 sRGB 颜色
uvToRenderTargetUV(float2)float2转换 UV 坐标以允许从 RenderTarget attachment 进行采样
  • sampling from render targets
    • 对于曲面域 (surface domain) 中的材质,从 filament::RenderTarget 的一个 filament::Texture采样时,请使用uvToRenderTargetUV变换纹理坐标。这会将根据正在使用的backend 来翻转坐标 (不同backend 对uv坐标的坐标轴定义不同)。

Handling colors

Linear colors

  • 如果颜色数据来自纹理,只需确保使用 sRGB 纹理即可从 sRGB 到线性的自动硬件转换中受益。

  • 如果颜色数据作为参数传递给材质,则可以通过在每个颜色通道上运行以下算法,将 sRGB 转换为线性:

    float sRGB_to_linear(float color) {
    	return color <= 0.04045 ? color / 12.92 : pow((color + 0.055) / 1.055, 2.4);
    }
    
  • 或者,可以使用下面两个简化、但不太准确的版本之一:

    // Cheaper
    linearColor = pow(color, 2.2);
    // Cheapest
    linearColor = color * color;
    

Pre-multiplied alpha

  • 如果颜色的 RGB 分量乘以 Alpha 通道,则使用Pre-multiplied alpha:

    // Compute pre-multiplied color
    color.rgb *= color.a;
    
  • 如果从纹理中对颜色进行采样,则只需确保提前 pre-multiplied 纹理数据即可。

    • 默认情况下,在 Android 设备上,从 Bitmap 上传的任何纹理都将预先 pre-multiplied。

总结

?? 本节主要整理一下材质框架使用的API,以便后期进行查询使用。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:53:21  更:2022-03-16 22:55:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 17:00:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码