OpenGLES(四)glsl语法

这篇具有很好参考价值的文章主要介绍了OpenGLES(四)glsl语法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

GLSL是OpenGL着色器语言(OpenGL Shading Language)

版本说明

OpenGLES版本 GLSL版本
2.0 100
3.0 300
3.1 310
3.2 320
GLSL3.0与2.0差异
  • inout 取代 attributevarying
  • 头文件多了个 #version 300 es
  • 纹理 texture2Dtexture3D 统统改为 texture
  • 内置函数 gl_FragColorgl_FragData 删除,如果片段着色器要输出用out声明字段输出,不过保留了gl_Position
  • 可直接使用 layout 指定属性位置

数据类型

  • 基本数据类型:void、int、float、double、uint、bool
  • 容器数据类型:向量(Vector)、矩阵(Matrix)
向量

可以包含有2、3、4个分量,分量的类型可以是基础数据类型的任意一个(除过void类型),n表示向量维度,如下表:

数据类型 说明
vecn 包含n个float分量的默认向量
bvecn 包含n个bool分量的默认向量
ivecn 包含n个int分量的向量
uvecn 包含n个unsigned int分量的向量
dvecn 包含n个double分量的向量
  • 一个向量可能有特殊含义,其可以看作是空间坐标(x,y,z,w)、颜色(r,g,b,a)或纹理坐标(s,t,p,q)。
  • 向量的分量可以通过vecn.x这种方式获取,可以分别使用.x、.y、.z、.w来获取它们的第1、2、3、4个分量(或着使用颜色vecn.rgba、或者使用纹理venc.stpq)。
  • 向量可以使用上面4个字母任意组合来创建一个和分量类型相同的新向量,只要原来向量有那些分量即可,这个叫做向量重组
//如果向量构造器中只提供了一个标量参数,则向量中所有值都会设定为该参数,即color={1.0,1.0,1.0,1.0}
vec4 color = vec4(1.0);

//向量重组
vec2 someVec;
vec4 differentVec = someVec.xyxx;
vec3 anotherVec = differentVec.zyw;
vec4 otherVec = someVec.xxxx + anotherVec.yxzy;
矩阵

OpenGL的矩阵是列主顺序的

数据类型 说明
mat2 或 mat2x2 2×2的浮点数矩阵类型
mat3 或 mat3x3 3×3的浮点数矩阵类型
mat4x4 4×4的浮点矩阵
mat2x3 2列3行的浮点矩阵
mat3x2 3列2行的浮点矩阵
mat3x4 3列4行的浮点矩阵
mat4x2 4列2行的浮点矩阵
mat4x3 4列3行的浮点矩阵

输入与输出

GLSL 3.0 定义了inout 关键字专门来实现输入输出,只要一个输出变量与下一个着色器阶段的输入匹配,它就会传递下去。

顶点着色器

顶点着色器必须要有一个输入,用于接收顶点数据。每个输入变量也叫顶点属性(Vertex Attribute)。顶点属性是有上限的,它一般由硬件来决定。OpenGL确保至少有16个包含4分量的顶点属性可用,但是有些硬件或许允许更多的顶点属性,可以通过GL_MAX_VERTEX_ATTRIBS查询

#version 300 es

//顶点着色器输入(用于从顶点数据中接收数据)
//layout (location = 0) 是限定该属性的位置为 0,如果不限定,需要通过 glGetAttribLocation 查询
layout (location = 0) in vec3 aPos; 
//为片段着色器指定一个颜色输出
out vec4 vertexColor;

void main(){
	//把一个vec3作为vec4的构造器的参数
    gl_Position = vec4(aPos, 1.0);
	//把输出变量设置为暗红色
    vertexColor = vec4(0.5, 0.0, 0.0, 1.0);
}
片段着色器

片段着色器必须要有一个vec4颜色输出,因为片段着色器需要输出颜色信息来绘制。

#version 300 es
//片段着色器的输出,用于最终输出的颜色
out vec4 FragColor;
//从顶点着色器传来的输入变量(名称相同、类型相同)
in vec4 vertexColor;

void main(){
    FragColor = vertexColor;
}

限定符

uniform

uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,uniform和顶点属性有如下不同点:

  • uniform是全局的(Global)
  • 在所有着色器程序对象中都是独一无二的
  • 可以被任意着色器在任意阶段访问
  • 无论将 uniform 值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新
  • 如果声明了一个uniform却在GLSL代码中没用过,编译器会静默移除这个变量
#version 330 core
out vec4 FragColor;
// 在OpenGL程序代码中设定这个变量
uniform vec4 ourColor;
void main()
{
    FragColor = ourColor;
}

获取和设置Uniform变量

//获取 Uniform 变量的位置属性
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");

//设置 Uniform 变量的值,设置之前必须已经激活了Program程序(glUseProgram)
glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);

glUniform有多个不同后缀的函数(C语言不支持重载)

后缀 含义
f 函数需要一个float作为它的值
i 函数需要一个int作为它的值
ui 函数需要一个unsigned int作为它的值
3f 函数需要3个float作为它的值
fv 函数需要一个float向量/数组作为它的值
precision

设置数据类型的默认精度

//默认精度限定符放在着色器代码起始位置
precision highp float;
precision mediump int;
浮点数范围 整数范围
highp (-2^62, 2^62) (-2^16, 2^16)
mediump (-2^14, 2^14) (-2^10, 2^10)
lowp (-2, 2) (-2^8, 2^8)

函数

GLSL 中函数不能够递归调用,且必须声明返回值类型,无返回值时声明为 void。其内建函数如下:文章来源地址https://www.toymoban.com/news/detail-737702.html

//返回 x、y 的线性混合的,如:x⋅(1−a)+y⋅a
T mix (T x, T y, T a)
T mix (T x, T y, float a)

到了这里,关于OpenGLES(四)glsl语法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenGLES:GLSurfaceView实现Android Camera预览

    前几篇博文对OpenGL做了一些讲解,虽然只是一些基础的知识,但也足够玩出很多有趣的东东了 之前讲过OpenGL本身只是一个开源的图形渲染标准协议,所以OpenGL的学习应注重实战实操,多动手写代码才更有助于巩固所学知识 OpenGLES是OpenGL适配移动端嵌入式设备的版本,裁剪了

    2024年02月04日
    浏览(40)
  • Android OpenGLES + Camera1 相机预览

    if (isCreate) { return; } onCreatePre(); onClearColor(); onInitBlend(); onInitVertexBuffer(); onInitCoordinateBuffer(); onInitVbo(); onInitProgram(); onCreateAfter(); isCreate = true; } @Override public void onChange(int width, int height) { if (isChange) { return; } onChangePre(); setWidth(width); setHeight(height); onViewport(); onInitFbo(); onChangeAfter(

    2024年04月12日
    浏览(34)
  • Android OpenGLES + Camera1 相机预览(2)

    private void checkRenderThreadState() { if (mGLThread != null) { throw new IllegalStateException( “setRenderer has already been called for this instance.”); } } 也就是说,设置了 Renderer 后,就不能更换了,那么如果有需求:本来是渲染一个灰度滤镜的,当想变换其他滤镜的时候,又不能重新设置 Renderer ,此

    2024年04月25日
    浏览(30)
  • 【Android OpenGL开发】OpenGL ES与EGL介绍

    OpenGL(Open Graphics Library)是一个跨编程语言、跨平台的编程图形程序接口,主要用于图像的渲染。 Android提供了简化版的OpenGL接口,即OpenGL ES。 早先定义 OpenGL ES 是 OpenGL 的嵌入式设备版本,用于移动端平台(Android、iOS),但由于嵌入式设备要求的是高性能,所以一些其它纯

    2024年02月04日
    浏览(77)
  • 【错误记录】Unity 安卓打包报错( Platform Android with graphics API OpenGLES3 is not supported with HDRP )

    在 Unity 编辑器中 , 选择 \\\" 菜单栏 | File | Build Settings \\\" 选项 , 编译 Android Apk 文件 ; 报如下错误 : 报错信息 Platform Android with graphics API OpenGLES3 is not supported with HDRP, use the Vulkan graphics API instead. , HDRP不支持带有图形API OpenGLES3的平台Android,请使用Vulkan图形API代替 ; HDRP 是 高清渲染管

    2024年02月12日
    浏览(31)
  • Android OpenGl 介绍(一)

    一、OpenGl 介绍 看到这个介绍,相信大家都不会陌生,因为在平时的工作中,或多或少大家都会听说过 openGl 这个东西,而且对它的印象基本都是觉得比较高深难懂。其实这个东西也不是那么难,那么无从下手,首先必须要了解一些基本的背景和搞懂一些基本概念,然后就可

    2024年02月16日
    浏览(31)
  • Android核心开发之——OpenGL

    OpenGL是一种用于编程计算机图形的应用程序编程接口(API)。它提供了一系列函数和方法,用于绘制2D和3D图形,以及进行渲染和图形处理。OpenGL可以跨平台使用,支持各种操作系统和硬件设备。它被广泛应用于游戏开发、虚拟现实、科学可视化、计算机辅助设计等领域。Op

    2024年02月13日
    浏览(29)
  • Android OpenGL ES 学习(四) -- 正交投影

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投屏 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EBO/IBO 优化程序 Android OpenG

    2024年02月13日
    浏览(31)
  • Android OpenGL 渲染相机预览画面显示体系

    OpenGL能进行高效得渲染图形图像,并支持各种复杂的特效和动画。 而在 Android 当中,运用的是 OpenGL ES ,它是OpenGL的一个 轻量级版本 ,专门用于在移动设备、游戏控制台、嵌入式系统等嵌入式环境中使用。 它可以做相机滤镜或者图片滤镜的效果,以相机滤镜为例: 首先 C

    2023年04月24日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包