首页 > 其他分享 >GLSL语法简单总结

GLSL语法简单总结

时间:2023-03-11 22:45:36浏览次数:53  
标签:GLSL 总结 1.0 变量 0.0 语法 vec4 着色器 out

1、变量类型

基础类型:bool,int,uint,float,double

向量类型:vecN,bvecN,ivecN,uvecN,dvecN

N表示向量维数(N=1,2,3,4)。

含前缀b为bool向量,i为int向量,u为uint向量,d为double向量,不含前缀为float向量。

可以通过.xyzw(直角坐标)或者.rgba(颜色分量)或者.stpq(纹理坐标)分别访问第1、2、3、4个分量,并且分量可以随其重组,构成新的向量。

向量用法示例:

vec2 v2  = vec2(0.0,1.0);

vec3 v3  = v2.xxy;      //v3=(0.0,0.0,1.0)

vec4 v4  = vec4(v3.zyx,0.1); //v4=(1.0,0.0,0.0,0.1)

vec4 v41 = vec4(v2,0.1,0.2); //v41=(0.0,1.0,0.1,0.2)

矩阵类型:mat2,mat3,mat4分别为2x2,3x3,4x4 float矩阵。

mat2 m = mat2(1.0,2.0,3.0,4.0);

//构造一个2x2的矩阵,(1.0,2.0)为第一列,(3.0,4.0)为第二列。

纹理类型:sampler2D,samplerCube 分别为2D纹理和立方体纹理。

结构体:与C语言结构体类似。

数组:与C语言数组类似,但GLSL中只能使用一维数组。

 

2、变量限定符

in和out:in和out设定变量为输入或输出,out标识的变量被送往下一着色器阶段,如果在下一着色器阶段的in变量与该out变量相同(名称和类型都要相同),则使用该out变量的值。

in和out还可以用于接口块(Interface Block),以传送一组数据,如下面示例。

如果片段着色器定义out FragColor变量,则该变量就是最终的像素颜色。

此外为方便在OpenGL中找到变量位置,可使用layout,layout(location=n)标识变量的位置,OpenGL中glVertexAttribPointer的第一个参数就是这个n的值,通过这个位置可以很方便设置顶点属性,如果没有这个标识符,则需要在OpenGL中使用glGetAttribLocation查找变量位置。

//顶点着色器

#version 330 core

layout (location = 0) in vec3 vertexPos;

out vec4 vertexColor;

out Interface_Block

{

    vec4 vColor;

} ib_out;

 

void main()

{

    gl_Position = vec4(vertexPos, 1.0);

    vertexColor = vec4(1.0, 0.0, 0.0, 1.0);

    ib_out.vColor= vec4(0.0, 1.0, 0.0, 1.0);

}

 

//片段着色器

#version 330 core

out vec4 FragColor;//最终的颜色

in vec4 vertexColor; // 使用顶点着色器中的vertexColor

in Interface_Block//接口块块名须保持一致,实例名可以不一样

{

   vec4 vColor;

} ib_in;

 

void main()

{

    FragColor = vertexColor;

    //FragColor = ib_in.vColor;//使用顶点着色器中ib_out.vColor

}

uniform:uniform标识的变量为全局变量,可以被任意着色器在任意阶段访问,可以在OpenGL程序中以glGetUniformLocation函数获取变量位置,以glUniform前缀的函数动态修改其值。

#version 330 core

uniform vec4 uniformColor; // 使用glUniform4f函数改变这个变量值

out vec4 FragColor;

void main()

{

    FragColor = uniformColor;

}

3、流控制

流控制与C语言类似,有if else,switch case,for,while,do while。

4、函数

函数的定义与C语言类似,着色器的执行入口也是main()函数。

5、内建变量

<img src="https://pic1.zhimg.com/v2-06dd3555c43ac9347e6d3c10df406068_b.jpg" data-caption="" data-size="normal" data-rawwidth="498" data-rawheight="279" class="origin_image zh-lightbox-thumb" width="498" data-original="https://pic1.zhimg.com/v2-06dd3555c43ac9347e6d3c10df406068_r.jpg"/>

 

6、内建函数

(1)基本函数

<img src="https://pic3.zhimg.com/v2-b515afbfb61d20820ceec6a7fcee7e7a_b.jpg" data-caption="" data-size="normal" data-rawwidth="500" data-rawheight="453" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic3.zhimg.com/v2-b515afbfb61d20820ceec6a7fcee7e7a_r.jpg"/>

 

(2)三角函数

<img src="https://pic1.zhimg.com/v2-b18f95d2ceb5d4b8448df5f2f443f7b0_b.jpg" data-caption="" data-size="normal" data-rawwidth="499" data-rawheight="116" class="origin_image zh-lightbox-thumb" width="499" data-original="https://pic1.zhimg.com/v2-b18f95d2ceb5d4b8448df5f2f443f7b0_r.jpg"/>

 

(3)指数函数

<img src="https://pic3.zhimg.com/v2-4424727e411fbbbfe4d9e36a961218ea_b.jpg" data-caption="" data-size="normal" data-rawwidth="501" data-rawheight="120" class="origin_image zh-lightbox-thumb" width="501" data-original="https://pic3.zhimg.com/v2-4424727e411fbbbfe4d9e36a961218ea_r.jpg"/>

 

(4)几何函数

<img src="https://pic4.zhimg.com/v2-0d72c85c08f8b2e8b5180a128b004b87_b.jpg" data-caption="" data-size="normal" data-rawwidth="501" data-rawheight="296" class="origin_image zh-lightbox-thumb" width="501" data-original="https://pic4.zhimg.com/v2-0d72c85c08f8b2e8b5180a128b004b87_r.jpg"/>

 

(5)纹理函数

<img src="https://pic2.zhimg.com/v2-e7206d0bd34930e187a1e666c0c5ba85_b.jpg" data-caption="" data-size="normal" data-rawwidth="499" data-rawheight="106" class="origin_image zh-lightbox-thumb" width="499" data-original="https://pic2.zhimg.com/v2-e7206d0bd34930e187a1e666c0c5ba85_r.jpg"/>

 

 

 

 

 

发布于 2021-11-03 16:52

https://zhuanlan.zhihu.com/p/429008839?utm_id=0

 

标签:GLSL,总结,1.0,变量,0.0,语法,vec4,着色器,out
From: https://www.cnblogs.com/im18620660608/p/17207251.html

相关文章

  • 今日总结
    今天复习了Javaservlet的相关内容packageservlet;importjava.io.IOException;importjava.util.List;importjavax.servlet.ServletException;importjavax.serv......
  • 2023/3/11 考试总结
    时间安排7.30~8.00询问很复杂,但是数据随机。直觉告诉我,直接暴力就是对的。写了个set把每个区间存在它的最大值和最小值位置上,然后暴力修改,但是大样例跑了很久。8.00~9......
  • 2023/3/11杂题总结(未完)
    ELCA这道题的整体思路就是,对于一个lct,我们能够维护的东西,需要保证能够在较优的时间内完成实边修改和区间合并(就是得保证支持实虚边转化和平衡树的维护),那么这道题,......
  • 2022/3/11 考试总结
    时间安排7.30~8.00先看T1,感觉是某种很典的模型,想了个做法,建出dfs树跑树形dp。样例过了,因为暴力很难写而且还要SPj就直接交了。8.00~10.00推了推T2,感觉解是惟一的,于是......
  • 3.11今日总结
    今天学习了安卓的日期控件CardDatePickerDialog.builder(this).setTitle("SETMAXDATE").setOnChoose(listener=object:CardDatePi......
  • 3.10今日总结
    因为H5页面在移动端的兼容性及扩展性方面体现出来的优势,又兼得APP中植入H5页面相应用的灵活性有大大的提升(如活动、游戏的更新等)。APP开发不可避免的须要载入一些H5页面。......
  • PMP项目变更管理及变更流程总结
    转载请注明出处:1. 变更管理流程           2.变更管理流程十步:0预防--1发起变更请求--2分析影响--3备选方案--4CCB批准--5更新项目管理计划......
  • 3.11号今日总结
    1.基本用法与事件处理:1)RadioButton(单选按钮)如题单选按钮,就是只能够选中一个,所以我们需要把RadioButton放到RadioGroup按钮组中,从而实现单选功能!先熟悉下如何使用Rad......
  • 2023/3/8 && 2023/3/11 模拟总结
    开摆,嘿嘿,开摆!2023/3/8IOI赛制/6道题/部分文件io集训期间的第一次模拟,看到是IOI赛制感觉好拿分,于是就挺放松的。开考之后看到T1,胡了一个二维前缀和暴力做法,爽拿3......
  • Day02-ES6新语法
    ES6新语法糖(初级)1什么是ES6JS语法分三块ECMAScript:基础语法BOM浏览器对象historylocationwindowDOM文档对象document编程语言JavaScript是ECMAScr......