惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Project Zero
Project Zero
D
DataBreaches.Net
博客园_首页
罗磊的独立博客
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
大猫的无限游戏
大猫的无限游戏
人人都是产品经理
人人都是产品经理
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Forbes - Security
Forbes - Security
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
雷峰网
雷峰网
Jina AI
Jina AI
O
OpenAI News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 三生石上(FineUI控件)
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
SegmentFault 最新的问题
V
Visual Studio Blog
Webroot Blog
Webroot Blog
GbyAI
GbyAI
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
腾讯CDC
IT之家
IT之家
C
Cyber Attacks, Cyber Crime and Cyber Security
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
T
Troy Hunt's Blog
博客园 - 叶小钗
N
News and Events Feed by Topic
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 司徒正美
C
Check Point Blog
T
Threatpost
SecWiki News
SecWiki News
爱范儿
爱范儿
阮一峰的网络日志
阮一峰的网络日志
P
Privacy International News Feed
J
Java Code Geeks
L
LINUX DO - 最新话题
PCI Perspectives
PCI Perspectives
T
Tailwind CSS Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Cisco Blogs
S
Schneier on Security

远飞闲记

用 OpenClaw 搭建全自动晨间简报系统 Open Claw(🦞龙虾): 新手最常踩的 8 个坑,我帮你踩过了 什么是AI Agent(智能体)? OpenClaw 在微信端使用指南 如何让OpenClaw🦞更好用-调教篇 OpenClaw(龙虾🦞)自主赚钱实验笔记 本地Qwen+云模型:OpenClaw真实体验 AI博客主题开发记 OpenClaw初试记 十年博客路:在AI水文泛滥的时代,为何还在坚守? AI Coding实战吐槽:别被"400刀大神"带偏,这些坑我帮你踩过了! 《相信》把不可能变为可能 我们写的程序被杀毒软件杀了,杀毒软件到底杀了什么? 👋2024 探索Unity单元测试:构建可靠游戏代码的基石 实用小黄鸭调试法 炸裂的Unity割韭菜这事 还是要有信念 您好2023 Docker启动提示虚拟化失败 Golang中配置文件热重载方案 重置博客主题 双链知识管理及logseq使用体验 魔幻的魔都疫情 漫谈国内NFT市场状况 如何在UE4中平衡蓝图与C++的使用 2021时光荏苒,2022可遇可期 UE4(Unreal Engine)本地化资源功能 摈弃:“拥有更多=做的更好的”的观念 鱿鱼游戏 研究UE4(虚幻引擎)后的感想 初试Caddy WebServer GitHub Copilot AI编程的感受 Mac Mini M1真香定律 地震提醒App 共和国失去两大功勋 币圈还好吗? Headless CMS 倒牛奶事件 “鸡娃”现象的观点 2020年新冠期间记录 社区团购团长的入门到放弃 路由折腾记 多电脑鼠键共享方案 Typescript循环引用 Circular Referenec 问题解决方法 《高效清单工作法:聪明人的无压时间管理手册》 Crossword Puzzles Privacy ShareTheCookies Privacy 七月的最后一天 游戏开发中使用的概率算法 笔直站立昂首挺胸的生活态度 Android和H5网游加速器解决方案的探索 Golang基础配置和Go Emacs开发环境的配置 使用Github Actions自动发布Hugo Blog配置 《青年到此为止》读书随笔 逛T推遇见比较有意思的事 GnuGPG Git中的使用及配置 《极简主义:活出生命的真意》阅读记录 疫情记录:热干面出院了 如何有效的阅读一本书:葱鲔火锅式笔记读书法 《麦肯锡精英高效阅读法》读书笔记 2020四年之约 疫情记闻 2020-二月二龙抬头 任天堂(Nintendo)switch NS游戏机 真香 MacBook Pro SSD 512G硬盘升级记 构建Facebook Instant Game本地测试环境 今日有感 Bye 2019,Hi 2020 猎魔人-The Witcher 如何判断是否适合加入创业团队 开发人员业余项目版权的见解 容易改变想法的人 及时止损 VSCode中远程调试NodeJS配置 Android Google Play 内购服务器订单校验 做产品是否要蹭热度 为什么会接入Google Adsense 成功和产品体验的一点想法 共享经济下的牺牲品们 折腰的梯子们 Emacs配置:Unity项目开发配置 人人都想当管理者 对焦虑和迷茫的理解 TypeScript强类型判断引发的问题 找回习惯和中产与爱好 程序员的成长之路 产品、技术、团队 爱心被滥用 工作996.生病ICU 2019初一记事 忆上海,换一种生活方式 记一次地震时的感受 押金是什么 Egret Jenkins搭建构建环境中遇见的坑 去年的总结 要懂的感恩 阿里云OSS+docker Owncloud安装 从修建房子来说开发过程的问题和流程 小记录 与人方便,与己方便
OpenGL ES中的顶点数组、顶点属性、缓冲区对象
2015-05-31 · via 远飞闲记

什么是顶点数据?

在计算机中图元的位置是通过x,y,z,w来存储或颜色数据是通过RGBA的数组格式存储的,然后通过多个点来进行图元装配和光栅化出图形.比如三角形3个点使用X,Y,Z表示如下:

  GLfloat vertex[]={
			0.0f,1.0f,1.0f, //x,y,z
			1.0f,0.5f,1.0f,
			0.0f,0.5f,1.0f			
			}

顶点属性数组

顶点属性数组对象就是存储在应用程序缓冲区的顶点数据,又分两种方式来分配和存储顶点属性数组:结构数组和数据结构,结构数组就是所有顶点数据使用一个数组来存储数据,把位置、颜色、法线、纹理UV坐标等数据放进一个数组结构中.数组结构就是把每个数据通过不同的数组结构存放顶点数据.结构数组的效率要高于数组结构,因为在通过结构数组的方式访问顶点数据是按照在内存中的顺序来访问的.缺点是修改了其中的数据必须重新更新已经保存在缓冲区中数据的跨距.

#define VERTEX_POS_INDX 0
#define VERTEX_POS_SIZE 3

#define VERTEX_COLOR_INDX 1
#define VERTEX_COLOR_SIZE 4

#define VERTEX_ATTRIB_SIZE (VERTEX_POS_SIZE+VERTEX_COLOR_SIZE)

GLfloat vertex[]={
                        0.0f,1.0f,1.0f, //x,y,z
			1.0f,0.0f,0.0f,1.0f, //RGBA
			1.0f,0.5f,1.0f,
			0.0f,1.0f,0.0f,1.0f,
			0.0f,0.5f,1.0f,
			0.0f,0.0f,1.0f,1.0f
		 }
//设置顶点位置属性数据数组
glVertexAttribPointer(VERTEX_POS_INDX,VERTEX_POS_SIZE,GL_FLOAT,GL_FALSE,VERTEX_ATTRIB_SIZE*sizeof(GLfloat),vertex);
//设置颜色属性数据数组
glVertexAttribPointer(VERTEX_COLOR_INDX,VERTEX_COLOR_SIZE,GL_FLOAT,GL_FALSE,(VERTEX_ATTRIB_SIZE*sizeof(GLfloat),vertex+VERTEX_POS_SIZE));
//启用顶点数组数据
glEableVertexAttribArray(VERTEX_POS_INDE);
glEnableVertexAttribArray(VERTEX_COLOR_INDE);
//根据顶点数据绘制三角形
glDrawArrays(GL_TRIANGLES,0,3);
//禁用顶点数组数据
glDisableVertexAttribArray(VERTEX_POS_INDE);
glDisableVertexAttribArray(VERTEX_COLOR_INDE);

顶点缓冲区对象

简单点说就是把图形顶点数据和索引数据缓存在图形设备内存GPU中,改善每次绘制图形都要复制应用程序中的顶点数据.缓冲区顶点数据对象分为两种:1.图元索引数据(GL_ELEMENT_ARRAY_BUFFER)和顶点数据(GL_ARRAY_BUFFER).

使用缓冲冲区顶点对象的步骤:

1. 分配缓冲区对象:glGenBuffer
2. 绑定缓冲区对象:glBindBuffer,第一次调用为分配空间,以后调用都是使用缓冲区对象.
3. 存储数据到缓冲区对象: glBufferData
4. 删除缓冲区对象:glDeleteBuffers,在不需要使用缓冲区对象的时候删除.

拿上边三角形的顶点数组数据来说,代码如下:

	......................
	
	GLunit buffer[2];
	glGenBuffer(2,&buffer);
	//绑定顶点数据到缓冲区对象
	glBindBuffer(GL_ARRAY_BUFFER,buffer[0]);
	glBufferData(GL_ARRAY_BUFFER,sizeof(vertex),vertex,GL_STATIC_DRAW);
	//绑定顶点索引数据到缓冲区对象
	GLShort indices[3]={0,1,2};
	glBindBuffer(GL_ELEMENTS_ARRAY_BUFFER,buffer[1]);
	glBufferData(GL_ELEMENTS_ARRAY_BUFFER,sizeof(GLShort)*3,indices,GL_STATIC_DRAW);

	//使用缓冲区对象
	glBindBuffer(GL_ARRAY_BUFFER,buffer[0]);
	glEnableVertexAttibArray(VERTEX_POS_INDX);
	glVertexAttribPointer(VERTEX_POS_INDX,VERTEX_POS_SIZE,GL_FLOAT,GL_FALSE,(VERTEX_ATTRIB_SIZE*sizeof(GLfloat)),(const void*)0);
	
	glVertexAttribPointer(VERTEX_COLOR_INDX,VERTEX_COLOR_SIZE,GL_FLOAT,GL_FALSE,(VERTEX_ATTRIB_SIZE*sizeof(GLfloat),(cons void*)(VERTEX_POS_SIZE*sizeof(GLfloat)));
	
	................

glDeleteBuffers删除已经存在的缓冲区对象

顶点数组对象(VAO)

这个特性是在opengl es3.0 中引入的,提供包含在顶点数组/顶点缓冲区对象配置之间切换所需要的所有状态的单一对象.只需要在设置缓冲区数据的时候glGenVertexArrays一个顶点数组对象ID,然后调用glBindVertexArray绑定已经生成数组对象的ID,在绘制图元的时候调用glBindVertexArray切换相应缓冲区内的数据并进行绘制.glDeleteVertexArray删除一个或者多个顶点数组对象.

映射缓冲区对象

应用程序设置缓冲区对象数据调用glBufferData的时候,可以将缓冲区对象数据存储映射到应用程序的内存地址空间,优点:减少应用程序的内存占用,只需要存储数据的一个副本.避免数据复制步骤通过映射出的GPU存储缓冲区对象的内存地址. 调用glMapBufferRange返回缓冲区存储数据范围的指针,出现错误则反悔NULL,glUnmapBuffer取消之前缓冲区映射.

着色器中如何关联顶点数据

  • 在顶点着色器源代码中使用layout(location=N) in限定符来获取顶点属性的值
  • 使用glBindAtttibLocation绑定索引到着色器代码变量.