opengles 顶点数组 android,OpenGLES顶点属性、顶点数组和缓冲区对象

顶点属性数据可以用一个顶点数组对每个顶点指定,也可以将一个常量值用于一个图元的所有顶点

OpenGLES支持最少16个顶点属性。准确查询顶点数量方法如下:

GLint maxVertexAttribs;

glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);

一、指定顶点数组

1、常量顶点属性:

常量顶点属性对于一个图元的所有顶点都相同,所以对一个图元的所有顶点只需指定一个值。函数如下:

void glVertexAttrib1f(GLuint index, GLfloat x);

void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);

void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);

void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);

void glVertexAttrib1fv(GLuint index, GLfloat x);

void glVertexAttrib2fv(GLuint index, GLfloat x, GLfloat y);

void glVertexAttrib3fv(GLuint index, GLfloat x, GLfloat y, GLfloat z);

void glVertexAttrib4fv(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);

glVertexAttrib* 命令用于加载index 指定的通用顶点属性。

2、顶点数组

顶点数组指定每个顶点的属性,是保存应用程序地址空间的缓冲区。他们作为顶点缓冲对象的基础,提供指定顶点属性数据的一个高效、灵活的手段。

void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *ptr);

void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *ptr);

index - 指定通用顶点属性索引。

size - 顶点数组中为索引引用的顶点属性所指定的分量数量。

type - 数据格式,两条函数均有的值:GL_BYTE,GL_UNSIGNED_BYTE,GL_SHORT,GL_UNSIGNED_SHORT,GL_INT,GL_UNSIGNED_INT,glVertexAttribPointer还包括GL_HALF_FLOAT,GL_FLOAT,GL_FIXED,GL_INT_2_10_10_10_REV,GL_UNSIGNED_INT_2_10_10_10_REV

normalized - 用于表示非浮点数据格式类型在转换为浮点值时是否应该规范化。对于glVertexAttribIPointer来说,这些值被当作整数对待

stride - 每个顶点由size指定顶点属性分量顺序存储。stride指定顶点索引 表示顶点数据之间的位移,大于0,表示使用该值作为下一个索引表示的顶点数据的跨距。

ptr - 如果使用客户端顶点数据,则保存顶点属性数据的缓冲区的指针,如果使用顶点缓冲区对象,则表示该缓冲区内的偏移量。

分配和存储顶点属性数据有两种常用的方法:

在一个缓冲区中存储顶点属性 —— 这种方法称为结构数组。结构表示顶点的所有属性,每个顶点有一个属性的数组。结构数组的分配方法通常是最高效的。

在单独的缓冲区中保存每个顶点属性 —— 这个方法称为数组结构。

顶点属性使用哪种数据格式

glVertexAttribPointer 中用type参数指定的顶点属性数据格式不仅影响顶点属性数据的图形内存存储需求,而且影响整体性能。OpenGLES 3.0开始支持GL_HALF_FLOAT 的16位浮点顶点格式,建议尽可能使用GL_HALF_FLOAT,即纹理、坐标、法线、副法线、切向量等使用GL_HALF_FLOAT,颜色存储为GL_UNSIGNED_BYTE,每个顶点颜色具有4个分量。

glVertexAttribPointer中规范化标志是如何工作的?

在用于顶点着色器之前,顶点属性在内部保存为单精度浮点数。如果数据类型表示顶点属性不是浮点数,顶点属性将在用于顶点着色器之前转换为单精度浮点数。规范化标志控制非浮点数顶点属性数据到单精度浮点值的转换,标志为假时,顶点数据被肢解转换为浮点数,如果为真且数据类型为GL_BYTE、GL_SHORT、GL_FIXED,则顶点数据被映射到[-1.0, 1.0]范围内,如果数据类型为GL_UNSIGNED_BYTE或GL_UNSIGNED_SHORT,则被映射到[0.0, 1.0]范围内。如果想要按照整数的形式访问整数型顶点,应该使用glVertexAttribIPointer。

常量顶点属性和顶点数组之间选择

glEnableVertexAttribArray 和 glDisableVertexAttribArray 命令分别用于启用和禁用通用顶点属性数组。

b8128654af23

二、在顶点着色器中声明顶点属性变量

属性变量也可以选择包含一个布局限定符,提供属性索引。示例:

layout(location = 0) in vec4 a_postion;

layout(location = 1) in vec2 a_texcoord;

layout(location = 2) in vec3 a_normal;

顶点着色器中声明为顶点属性的变量是只读变量,不能修改。属性可以在顶点着色器内部声明,不使用不会被认为是活动属性,着色器属性数量不能大于GL_MAX_VERTEX_ATTRIBS,否则无法被链接。

将顶点属性绑定到顶点着色器中的属性变量

顶点属性由in限定符指定,活动属性数量可以用glGetProgramiv查询,程序中活动属性列表可以用glGetActiveAttrib查询。

指定通用顶点属性和绑定到顶点着色器中的属性名称:

b8128654af23

OpenGLES3.0中,可以使用3种方法将通用顶点属性索引映射到顶点着色器中的一个属性变量名称。

1、索引在源码中用layout(location = N)声明指定

2、OpenGLES3.0将通用顶点属性索引绑定到属性名称

3、应用程序可以将顶点属性索引绑定到属性名称

使用glBindAttribLocation命令可以将通用顶点属性索引绑定到顶点着色器中的一个属性变量。这种绑定在下一个程序链接时生效——不会改变当前链接的程序中使用的绑定。

另外,也可以使用glGetAttribLocation命令查询分配的绑定,需要在返回program定义的程序独享最后一次链接时绑定到属性变量的通用属性索引。

三、顶点缓冲区对象

顶点数组指定的顶点数据保存在客户内存中。在进行glDrawArrays活着glDrawElements等绘图调用时,这些数据必须同客户内存复制到图形内存。

没必要每次绘图时都复制顶点数据,而是在图形内存中缓存这些数据,这样可以显著改善渲染性能,也可以降低内存带宽和电力消耗需求。这就是顶点缓冲区对象发挥作用的地方。

不紧紧是顶点数据,描述图元顶点索引、作为glDrawElements参数传递的元素索引也可以缓存。

GL_ARRAY_BUFFER 指定的数组缓冲区对象用于创建保存顶点数据的缓冲区对象。

GL_ELEMENT_ARRAY_BUFFER 指定的元素数组缓冲区对象用于保存图元索引的缓冲区对象。

创建和绑定顶点缓冲区对象例子:

void initVertexBufferObjects(vertex_t *vertexBuffer,

GLushort *indices,

GLuint numVertices,

GLuint numIndices,

GLuint *vboIds) {

// 获取vboIds中两个未用的缓冲区对象名称。然后vboIds返回的未使用的缓冲区对象名称用于创建一个数组缓冲区对象

// 和一个元素数组缓冲区对象。数组缓冲区对象用于保存一个或多个图元的顶点属性数据。

glGenBuffers(2, vboIds);

glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]);

glBufferData(GL_ARRAY_BUFFER, numVertices *sizeof(vertex_t),

vertexBuffer, GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[1]);

glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices *sizeof(GLushort),

indices, GL_STATIC_DRAW);

}

glGenBuffers(GLsizei n, GLuint * buffers) :分配n个缓冲区对象名称,并在buffers中返回它们。

glBindBuffer 用于指定当前缓冲区对象。第一次通过调用glBindBuffer绑定缓冲区对象名称时,缓冲区对象可以默认状态分配;如果分配成功,则分配的对象绑定微目标的当前缓冲区对象。

glBufferData 用于创建和初始化顶点数组或元素数组

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 实体类 临时注解_JPA:Java持久层API--配置流程

一、JPA概述1.1 JPA是什么JPA (Java Persistence API) Java持久化API。是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没有实现 关注点: ORM ,标准 概念 (关键字&#xf…

android新架构,Android新架构组件 LifeCycles 简介

一、前言为了使开发者能尽快在 Android 平台上开发出高质量的项目,Android 官方推出了 Android Jetpack 项目,旨在从基础,架构,行为以及界面 4 大方面体系化地为我们提供组件级别的支持。当然,在实际开发过程中&#x…

领域驱动设计 pdf_什么是领域驱动设计?

什么是领域驱动设计?你可能使用领域驱动设计(DDD)开发了一些项目。你可能很满意, 使用领域模型来开发领域业务。并且得意地展示给你的同事看,他们会说“666”。但有的时候你使用领域模型你总觉得哪儿有点不对劲。你会嘀咕你可能遗漏了什么。 …

Android四级缓存,RecyclerView 源码四级缓存原理

入口我们从使用功能上去读取源码,通常的用法是这个样子-> 我们设置layoutmanager,GridLayouManager 继承LinearLayoutManager,所以我们就LinearLayoutManager 为基准查看rv.layoutManager GridLayoutManager(this,5)rv.addItemDecoration…

织梦自定义html文本,织梦自定义标签dede:sql根据自定义字段填的文章id获取相关文章...

这篇文章主要为大家详细介绍了织梦自定义标签dede:sql根据自定义字段填的文章id获取相关文章,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。有的时候我们需要通过织梦的dede:sql据自定义字段填的文章id获取相关文…

python 杀死子进程_Python:当父异常终止时,如何杀死子进程?

小编典典 呵呵,我昨天自己在研究这个!假设您无法更改子程序: 在Linux上,prctl(PR_SET_PDEATHSIG,...)可能是唯一可靠的选择。(如果绝对有必要终止子进程,那么您可能希望将终止信号设置为SIGKILL而不是SIGTE…

html评论置顶功能,微信公众号精选留言评论怎么置顶显示?功能在哪里设置?...

微信公众号精选留言怎么置顶?微信公众号留言功能新增了置顶精选留言的设置,那么微信公众号留言功能在哪里设置呢?下文小乐哥给大家介绍一下!微信公众号精选留言怎么置顶?微信公众平台悄然上线了一个新功能,…

python函数增强代码可读性_写Python必须知道的这几个代码技巧!你会吗?

Day09 函数的初始 函数:函数是以功能为导向,一个函数封装一个功能。登录,注册,文件的改的操作。。。 函数减少代码的重复性,增强了代码的可读性; 获取任意一个字符串的元素的个数 s1 "xiaomingxiaoho…

shell脚本发邮件内容html,[转]Shell脚本中发送html邮件的方法

作为运维人员,免不了要编写一些监控脚本,并将监控结果及时的发送出来。那么通过邮件发送是比较常用的一种通知方式了。通常的,如果需要发送的内容是简单的文本文件,那么使用/bin/mailx就可以了,但是如果想要发送更复杂…

learn python app v3_‎App Store 上的“Learn Python and Scratch”

Learn “Python and Scratch Programming” from AI driven coach and satisfy your thirst for knowledge. App offers bite sized videos, quizzes and AI driven coach to help you become smarter and become great. Just 60 minutes a week can help you become great in …

计算机应用基础知识竞赛题,计算机基础知识题库

随着科学技术的进步,计算机已逐渐渗入人们的生活中,相应的计算机知识是需要具备的,那么你对计算机基础知识了解多少呢?以下是由学习啦小编整理关于计算机基础知识题库的内容,希望大家喜欢!计算机基础知识题库一、单选题1、 第一台…

inspect python_python之inspect模块

inspect模块主要提供了四种用处: 1.对是否是模块、框架、函数进行类型检查 2.获取源码 3.获取类或者函数的参数信息 4.解析堆栈 一、type and members 1. inspect.getmembers(object[, predicate]) 第二个参数通常可以根据需要调用如下16个方法; 返回值为…

HTML打开网页拒绝访问,192.168.1.1拒绝访问怎么办?

问:为什么设置路由器时,在浏览器中输入192.168.1.1,结果显示拒绝访问,这个问题怎么解决?答:如果是在设置路由器的时候,登录192.168.1.1被拒绝访问,多半是你自己操作有问题导致的&…

python中goto的用法_python3里用goto

python里用goto也是小Pa最近做的项目里的一个需求。python不像C有自带的goto, 需要用额外的包,目前为止,小pa只看到2个goto的包: 这2个小Pa都下载试用过,goto因为开发的时候比较早,对于python3的支持不太好,不推荐使用…

delphi打印html文件路径,Delphi获取文件名、不带扩展名文件名、文件所在路径、上级文件夹路径的方法...

1.获取不带扩展名的文件名方法,利用ChangeFileExt函数修改传入参数的扩展为空,并不会对文件本身产生变更。ChangeFileExt(ExtractFileName(‘D:\KK\Test\123.txt‘),‘‘); //返回 1232.获取上级文件夹路径的方法。ExtractFileDir(‘D:\KK\Test\‘)‘..‘…

gitlab git clone 输入密码_gitlab1:部署gitlab

1、配置yum源vim /etc/yum.repos.d/gitlab-ce.repo复制以下内容:[gitlab-ce]nameGitlab CE Repositorybaseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/gpgcheck0enabled12、更新本地yum缓存sudo yum makecache3、安装GitLab社区版sudo y…

计算机专业英语第五章ppt,计算机专业英语第五章.ppt

计算机专业英语第五章Background The Internet protocols are the worlds most popular open-system (nonproprietary) protocol suite because they can be used to communicate across any set of interconnected networks and are equally well suited for LAN and WAN comm…

python播放在线音乐_Python实现在线音乐播放器

最近这几天,学习了一下python,对于爬虫比较感兴趣,就做了一个简单的爬虫项目,使用Python的库Tkinsert做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口,通过re…

golang如何打印float64的整数部分_2020-08-10:如何不用加减乘除求浮点数的2倍值?...

福哥答案2020-08-10:浮点数符号位阶码尾数,阶码加1就是浮点数的2倍值。代码用golang编写,如下:package test33_addimport ( "fmt" "math" "testing")/*//https://www.bbsmax.com/A/6pdDX7…

五年级数学上册用计算机探索规律,人教版小学五年级数学上册《用计算器探索规律》课后反思...

当前,新课程改革强调学生学习方式的转变.高效课堂是课程改革过程中有效学习方式之一.在高效课堂中,孩子们能发挥自己潜能、展示自己的才能,提高了孩子们的学习兴趣.如何让高效课堂焕发光彩能?一、合理分组,恰当分工合理分组是高效课堂顺利进行的前提.在以前的学习过…