OpenGL ES 3.0 顶点属性变量的赋值

简介: 笔记

使用方式


先来看着顶点色器程序

const char vShaderStr[] =
        "#version 300 es                            \n"
        "layout(location = 1) in vec4 a_position;   \n"
        "layout(location = 0) in vec4 a_color;      \n"
        "out vec4 v_color;                          \n"
        "void main()                                \n"
        "{                                          \n"
        "    v_color = a_color;                     \n"
        "    gl_Position = a_position;              \n"
        "}";

着色器程序中有两个输入属性变量a_positiona_color,它们对应的index分别为1和0。

下面开始传递值给属性变量location=1

/**
 * 指定index=1的顶点属性,将传给顶点着色器location=1的属性变量
 * 属性向量维度为3,{x,y,z}
 * 精度 GL_FLOAT
 * 强制规范化 GL_FALSE
 * 读取方式,0表示顺序读取,没有间隔
 * 属性数组指针 vertexPos
 */
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, vertexPos);
//开启属性变量1,对应着色器程序location=1的属性变量
glEnableVertexAttribArray(1);
//使用完后关闭属性变量
glDisableVertexAttribArray(1);

为什么要先开启属性变量


出于性能考虑,默认情况下所有顶点着色器的属性(Attribute)变量都是关闭的,意味着数据在着色器端是不可见的,哪怕数据已经上传到GPU,由glEnableVertexAttribArray启用指定属性,才可在顶点着色器中访问逐顶点的属性数据。glVertexAttribPointer或VBO只是建立CPU和GPU之间的逻辑连接,从而实现了CPU数据上传至GPU。但是,数据在GPU端是否可见,即,着色器能否读取到数据,由是否启用了对应的属性决定,这就是glEnableVertexAttribArray的功能,允许顶点着色器读取GPU(服务器端)数据。

那么,glEnableVertexAttribArray应该在glVertexAttribPointer之前还是之后调用?答案是都可以,只要在绘图调用(glDraw*系列函数)前调用即可。


相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
目录
相关文章
|
4月前
|
XML 小程序 Java
【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)
【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)
53 0
|
存储 编解码 算法
Opengl ES之LUT滤镜(上)
Opengl ES之连载系列
342 0
|
数据安全/隐私保护 开发者
OpenGL ES 多目标渲染(MRT)
Opengl ES连载系列
221 0
|
数据安全/隐私保护 索引
Opengl ES之纹理数组
Opengl ES连载系列
173 0
|
数据安全/隐私保护
Opengl ES之水印贴图
Opengl ES之连载系列
86 0
|
Java 数据安全/隐私保护 Android开发
Opengl ES之矩阵变换(下)
Opengl ES连载系列
84 0
|
Java API 数据安全/隐私保护
Opengl ES之矩阵变换(上)
Opengl ES连载系列
83 0
|
存储
Opengl ES之踩坑记
Opengl ES之连载系列
91 0
|
存储 编解码 算法
Opengl ES之RGB转NV21
Opengl ES连载系列
116 0
|
并行计算 C++
Opengl ES之YUV数据渲染
Opengl ES连载系列
131 0