GLSL学习笔记---内置变量

2023-11-06

GLSL学习笔记 

GLSL语言内置的变量,包括内置的顶点属性(attribute)、一致变量(uniform)、易变变量(varying)以及常量(const),一方面加深印象,另一方面今天的文章可以为以后的编程做查询之用。

顶点属性—— 指顶点的信息,OpenGL据此绘制各个图元,对于传统的顶点属性包括坐标、纹理坐标、颜色等GLSL都会设置一个内置变量与之对应,以便在需要时可以在 顶点或片元着色器中直接引用,这也体现了GLSL与HLSL的一个最大的不同,HLSL里顶点的属性是通过语义来定义的,而GLSL充分考虑了 OpenGL是个状态机这一事实,将顶点属性设为一个状态变量。GLSL中内置的顶点属性包括以下几个:

// 顶点属性

attribute vec4 gl_Color;              // 顶点颜色

attribute vec4 gl_SecondaryColor;     // 辅助顶点颜色

attribute vec3 gl_Normal;             // 顶点法线

attribute vec4 gl_Vertex;             // 顶点物体空间坐标(未变换)

attribute vec4 gl_MultiTexCoord[0-N]; // 顶点纹理坐标(N = gl_MaxTextureCoords)

attribute float gl_FogCoord;          // 顶点雾坐标

值得一提的是用户可以调用glVertexAttrib设置自己的顶点属性(当然个数是有限制的)

一致变量—— 就是常说的Uniform,这是用户向GLSL传递自己数据的最常用方法,比如光源位置等等。之所以称为一致变量,是为了与易变变量相区别。不同于顶点属 性在每个顶点有其自己的值,也不同于易变变量由顶点程序向片元程序插值传递,一致变量在一个图元的绘制过程中是不会改变的,而且可以在顶点shader和 片元shader间共享。这部分变量主要用来描述OpenGL的状态,可以看作OpenGL状态机的复制。GLSL内置的一致变量包括:

// 矩阵状态

uniform mat4 gl_ModelViewMatrix;                // 模型视图变换矩阵

uniform mat4 gl_ProjectMatrix;                  // 投影矩阵

uniform mat4 gl_ModelViewProjectMatrix;         // 模型视图投影变换矩阵(ftransform())

uniform mat3 gl_NormalMatrix;                   // 法向量变换到视空间矩阵

uniform mat4 gl_TextureMatrix[gl_MatTextureCoords];     // 各纹理变换矩阵

 

// 普通缩放因子

uniform float gl_NormalScale;

 

// 窗口坐标深度范围

struct gl_DepthRangeParameters

{

    float near;

     float far;

    float diff; // far-near

};

uniform gl_DepthRangeParameters gl_DepthRange;

 

// 裁剪平面

uniform vec4 gl_ClipPlane[gl_MaxClipPlanes];

 

// 点属性

struct gl_PointParameters

{

    float size;

     float sizeMin;

    float sizeMax;

    float fadeThresholdSize;

     float distanceConstantAttenuation;

    float distanceLinearAttenuation;

    float distanceQuadraticAttenuation;

};

uniform gl_PointParameters gl_Point;

 

// 材质

struct gl_MaterialParameters

{

    vec4 emission;       // 自身光照Ecm

    vec4 ambient;        // 环境光吸收系数Acm

    vec4 diffuse;        // 漫反射吸收系数Dcm

    vec4 specular;       // 镜面反射吸收系数Scm

    float shininess;     // Srm

};

uniform gl_MaterialParameters gl_FrontMaterial;       // 正面材质

uniform gl_MaterialParameters gl_BackMaterial;        // 反面材质

 

// 光源性质,参数性质就不解释了,和OpenGL的三种光源性质是一样的

struct gl_LightSourceParameters

{

    vec4 ambient;                // Acii

    vec4 diffuse;                // Dcii

     vec4 specular;               // Scii

     vec4 position;               // Ppii

    vec4 halfVector;             // Hi

    vec3 spotDirection;          // Sdli

    float spotExponent;          // Srli

    float spotCutoff;            // Crli

     float spotCosCutoff;         // cos(Crli)

    float constantAttenuation;   // K0

    float linearAttenuation;     // K1

     float quadraticAttenuation; // K2

};

uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];

struct gl_LightModelParameters

{

    vec4 ambient;    // Acs

};

uniform gl_LightModelParameters gl_LightModel;

 

// 光照和材质的派生状态

struct gl_LightModelProducts

{

    vec4 sceneColor;       // Ecm+Acm*Acs

};

uniform gl_LightModelProducts gl_FrontLightModelProduct;

uniform gl_LightModelProducts gl_BackLightModelProduct;

struct gl_LightProducts

{

    vec4 ambient;      // Acm * Acli

    vec4 diffuse;      // Dcm * Dcli

    vec4 specular;     // Scm * Scli

};

uniform gl_LightProducts gl_FrontLightProduct[gl_MaxLights];

uniform gl_LightProducts gl_BackLightProduct[gl_MaxLights];

 

// 纹理环境和生成

unifrom vec4 gl_TextureEnvColor[gl_MaxTextureImageUnits];

unifrom vec4 gl_EyePlaneS[gl_MaxTextureCoords]; 

unifrom vec4 gl_EyePlaneT[gl_MaxTextureCoords];

unifrom vec4 gl_EyePlaneR[gl_MaxTextureCoords];

unifrom vec4 gl_EyePlaneQ[gl_MaxTextureCoords];

unifrom vec4 gl_ObjectPlaneS[gl_MaxTextureCoords];

unifrom vec4 gl_ObjectPlaneT[gl_MaxTextureCoords];

unifrom vec4 gl_ObjectPlaneR[gl_MaxTextureCoords];

unifrom vec4 gl_ObjectPlaneQ[gl_MaxTextureCoords];

 

// 雾参数

struct gl_FogParameters

{

    vec4 color;

    float density;

    float start;

    float end;

    float scale; // 1/(end-start)

};

uniform gl_FogParameters gl_Fog;

 

易变变量——易变变量只能在顶点shader和片元shader间传递,这期间实际上经过了一个光栅化的过程。内置的易变变量比较少,如下:

varying vec4 gl_Color;

varying vec4 gl_SecondaryColor;

varying vec4 gl_TexCoord[gl_MaxTextureCoords];

varying float gl_FogFragCoord;

熟悉图形管线的话可以自己描绘出这些易变变量是如何在顶点和片元程序间进行传递的。

 

内置常量——内置常量描述了显卡的渲染能力,依据各个显卡而定,这里就不一一列举了,如果想要查询的话可以用OpenGL的glGet函数获取MAX/MIN一族的常量值,这些值和内置变量的值是一致的。

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

GLSL学习笔记---内置变量 的相关文章

随机推荐

  • 设计之星 ai_“AI创新之星”评选活动征集工作已启动,6月15日止,速来!

    为了推动人工智能与实体经济发展的深度融合 充分展示国内企业和创业团队在人工智能领域的创新成果 中国人工智能 多媒体信息识别技术竞赛 组委会在竞赛期间组织开展 AI创新之星 评选活动项目征集工作 评 选 范 围 评选主要围绕 深化融合应用 培
  • randomforestregressor参数详解

    randomforestregressor参数详解 sklearn ensemble RandomForestRegressor n estimators 10 数值型参数 默认值为100 此参数指定了弱分类器的个数 设置的值越大 精确度越
  • 【JAVA基础】核心机制

    b站大学课程笔记 下面是课程链接 https www bilibili com video BV1364y1k7WG p 11 spm id from pageDriver vd source b53165477127ff81132dc79
  • 编译gnome-sharp-2.20.1出错

    To solve the problem gtk2 development library must be installed Under CentOS this can be done with yum groupinstall Deve
  • 密码正则

    正则一 密码正则 密码需包含字母 符号或者数字中至少两项且长度超过6位数 最多不超过16位数 const regPwd str gt let zmReg A Za z 大小写字母 let numReg 0 9 数字 let zfReg A
  • QTcp-心跳

    心跳机制 大致实现两中 心跳发起的主动方为谁 server或client 其基本思路 是在一定时间间隔内模拟server和client的通信 所以 这就比一般通信多了时间属性 而非随意进行交互 这里 我们将client作为主动方 其过程如下
  • 通过递归方法更改对象中的属性值

    需求 递归一个对象 我们更改其type全部为5 我们首先思考如果用每一层的循环我们怎么取解决 var data label 一级 1 type 1 children label 二级 1 1 type 1 children type 1
  • 有人提议扣程序员80%的税分给穷人,多人点赞。

    大家好 我是北妈 0 现在经济不好 很多人内心很慌 然后就有人开始打歪主意了 比如今天我看到了这个 这个说法甚至得到了很多人的支持和点赞 为什么会有很多人支持这种想法呢 毕竟在大家眼睛里 程序员是高薪 有钱的代名词 在大多数人工资收入都很低
  • SPI协议介绍

    在调试LCD驱动时用到了SPI接口 因此将了解 理解到的SPI知识记录下来 SPI接口有三线和四线两种类型 这里只介绍常用的四线类型 what 简单介绍 术语表 基本概念 why 优点特点 how 过程 what 简单介绍 术语表 name
  • 安装Ubuntu遇到unable to find a medium containing a live file system解决方案

    安装unable to find a medium containing a live file system 搜了好几个帖子 说是重新烧录u盘 换usb2 0 都不好使 最后找到了 在启动页面点击e 可以进入启动写参数界面 将quiet
  • 搜索提示是如何实现的

    经典的想法就是一个Trie的 keysWithPrefix 问题 更高级的 进一步考察 keysWithPrefix需要做prefix下的inOrder遍历 但是每当用户type下一个字符 那个提示列表瞬间就显示出来了 不像是遍历很大一棵树
  • CNCF X ACE KubeMeet 云原生应用管理专场·上海站来啦!

    简介 10月16日上海站 KubeMeet 将以 云原生应用管理 为主题 围绕 KubeVela 和 OpenKruise 两个项目的技术分享和企业实践展开 帮助开发者更好的应对云原生应用管理痛点 伴随着 Kubernetes 生态逐步完善
  • JavaScript实现随机抽奖功能

    通过数组存储抽奖号码 点击按钮实现名字 号码的滚动 点击停止即可实现抽奖功能 设置一个定时器 使用random方法随机获取号码 当点击按钮时去掉计时器实现暂停功能 思路解析 1 抽奖功能的名字滚动可以使用定时器都是获取名单中的数据 2 为了
  • 在字符串中删除特定的字符

    在字符串中删除特定的字符 字符串 题目 输入两个字符串 从第一字符串中删除第二个字符串中所有的字符 例如 输入 They are students 和 aeiou 则删除之后的第一个字符串变成 Thy r stdnts include
  • hashmap为什么用红黑树_HashMap

    以下面试题从看准 牛客 以及大量大厂面经中收集而来 面向真实面试 一 面试题总览 面试题整理后分为三大模块 分别是数据结构 扩容以及线程安全 同样梳理HashMap的时候也可以从这三个角度展开 下面这些问题相信大家在面试过程中也会被经常问到
  • 3D引擎--可移植到Android的开源的引擎

    随着android在全球的风靡 越来越多的人将自己的目光投向搭载android的 移动设备 但由于手持设备的局限性 怎样利用有限的资源来达到很好的体验 是设备厂商必须要考虑的问题 其中炫目的界面就是可以增加用户体验的一种方式 这其中 3D效
  • js按拼音查询结果集

    let strChineseFirstPY YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXX
  • 【Linux】权限管理,谁动了我代码?!

    目录 一 shell命令以及运行原理 二 Linux用户权限 1 su 用户切换 三 权限管理 1 理解 2 用户 3 文件类型 4 文件基本权限 5 设置文件权限方法 1 chmod 修改文件访问权限 2 chown 修改文件拥有者 3
  • TypeError: check() missing 1 required positional argument: 'self'

    TypeError check missing 1 required positional argument self TypeError check 缺少1个必需的位置参数 self 出现原因 1 没有实例化类直接引用 问题解决参考 ht
  • GLSL学习笔记---内置变量

    GLSL学习笔记 GLSL语言内置的变量 包括内置的顶点属性 attribute 一致变量 uniform 易变变量 varying 以及常量 const 一方面加深印象 另一方面今天的文章可以为以后的编程做查询之用 顶点属性 指顶点的信息