【Android OpenGL ES 开发 (二)】渲染管线与Shader

计算出每一帧耗费的时间

1.在头文件中加入time.h,cpp中实现如下计算时间接口

float GetFrameTime(){static  unsigned long long  lastTime=0,currentTime=0;timeval current;gettimeofday(&current, nullptr);//取当前时间currentTime = current.tv_sec * 1000 + current.tv_usec/1000; //s to ms  and  vs to msunsigned long long frameTime = lastTime==0?0:currentTime - lastTime;lastTime = currentTime;return float (frameTime)/1000.0f; //输出结果为s
}

引入外部的数学库

1.cpp文件中加入GLM的数学库,头文件中加入如下头文件

//引入数学库

#include "Glm/glm.hpp"

#include "Glm/ext.hpp"

齐次坐标与缺省的3D坐标系

1.普通坐标 x,y,z表示[1,2,3],齐次坐标是[1,2,3,1] ,x/w y/w z/w 是真正的3D坐标表示

2.OpenGL坐标系中心为(0, 0, 0)为坐标系原点,其中x,y的坐标方向遵循笛卡尔坐标系,z轴坐标从屏幕原点指向我们,方向为正,想要显示需要推到原点的后面,所以z坐标取负值。

3.CPP中点的初始化定义

struct Vectice{float mPosition[4];//x,y,z,w
};//顶点初始化部分Vectice vertices[3];//CPU -> GPUvertices[0].mPosition[0]=0.5f; //xvertices[0].mPosition[1]=0.5f; //yvertices[0].mPosition[2]=2.0f; //zvertices[0].mPosition[3]=1.0f; //wvertices[1].mPosition[0]=0.5f;vertices[1].mPosition[1]=0.5f;vertices[1].mPosition[2]=2.0f;vertices[1].mPosition[3]=1.0f;vertices[2].mPosition[0]=0.0f;vertices[2].mPosition[1]=0.5f;vertices[2].mPosition[2]=2.0f;vertices[2].mPosition[3]=1.0f;

渲染时的正反面(CCW与CW)的定义

1.CCW逆时针表示图形正面 ; CW顺时针表示图像反面

2.图元都是基于三角形

详解VBO(VertexBufferObject)

1.用来存放vertex 顶点坐标,作为gpu的一段换从空间,可以把cpu上面的数据缓存到次数,gpu执行的时候可以在此读取不需要进行多次cpu->gpu的拷贝操作

    GLuint  vbo;//vertex buffer object 存放顶点缓冲区的对象glGenBuffers(1,&vbo);//需要1个VBO,把vbo写入到显卡进去,供后续操作glBindBuffer(GL_ARRAY_BUFFER,vbo);//把vbo设置到卡槽上//glBufferData(GL_ARRAY_BUFFER,sizeof(Vectice)*3, nullptr,GL_STATIC_DRAW);//只在GPU上开辟内存不传数据//glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(Vectice)*3,vertices);//加入数组,0指vbo偏移位置glBufferData(GL_ARRAY_BUFFER,sizeof(Vectice)*3,vertices,GL_STATIC_DRAW);//cpu -> gpu,向GL_ARRAY_BUFFER加入数据glBindBuffer(GL_ARRAY_BUFFER,0);//卡槽重新绑定,防止误操作

详解GPU的工作流程

1.shader通常称为着色器,作用是把CPU上的点渲染出来。

2.shader是并行的。

3.流程:数据data (顶点数据) ----->VS(输入:data的顶点数据,输出:gl_Position的 vec4 顶点数据)----->光栅化处理(显卡自动负责,把点连成生成面,其中包括一定像素)------>FS(输入:光栅器的输出的像素,输出画面);注意VS和FS点会同时被并行执行,多个点可以同时处理。

最简单的Shader代码

1.Vertext shader (顶点着色器)

/*vec4是齐次坐标 vector.xyzw 其中xyzw 可以任意组合
vector.rgba 其中rgba 可以任意组合
vector.stpq 其中rgba 可以任意组合
*/
attribute vec4 position;   //vec4是齐次坐标  
uniform mat4 U_ModelMatrix;    //mat4是4x4矩阵 ,模型矩阵需要从C++传递过来
uniform mat4 U_ViewMatrix;     //视口矩阵需要从C++传递过来
uniform mat4 U_ProjectionMatrix;   //投影矩阵需要从C++传递过来
void main(){//自右向左,模型空间下的点-》世界坐标系-》视口矩阵转到视口空间,摄像机看到的带你-》屏幕空间gl_Position = U_ProjectionMatrix * U_ViewMatrix * U_ModelMatrix * position;
}

2.Fragment shader (片元着色器)

void main(){gl_FragColor = vec4(1.0,1.0,1.0,1.0); //gl_FragColor是输出点的颜色
}

详解Attribute和Uniform关键字

1Uniform,使用的一些变量都是一样的使用Uniform。 

2.Attribute,随着属性组变化使用Attribute。

4.varying ,主要负责在vertex 和 fragment 之间传递变量。

3. OPenGLES2.0最多支持8个属性组,3.0支持16个。

更多相关参考

详解3D渲染管线

1.MVP(M,模型矩阵;V,视口矩阵;P,投影矩阵)

自右向左,世界坐标系----------》模型空间下的点-----》视口矩阵转到视口空间,摄像机看到的带你---------》屏幕空间

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

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

相关文章

tibco汉化包6.3.0_TIBCO BusinessWorks 6和Container Edition与BW5的比较

tibco汉化包6.3.0[本文已于一段时间前发布在TIBCO博客上 。 我还在适当的地方添加了一些有关BusinessWorks Container Edition(BW CE)的信息 。 下面定义的大多数特征对于BW6和BW CE都是正确的] TIBCO ActiveMatrix BusinessWorks 6(BW6&…

python地图散点图_Python中基于Basemap的三维散点图

我正在尝试绘制一个三维散点图,图中是Python身上的烟羽,下面是北美的地图。我试过各种方法,但似乎都有缺点。我现在的代码是:fig plt.figure(figsize(22,4))ax Axes3D(fig)M Basemap(llcrnrlon-140,llcrnrlat10,urcrnrlon-40,u…

【Android OpenGL ES 开发 (三)】Shader 扩展

编译Shader代码 1.封装一个编译shader的接口 GLuint CompileShader(GLenum shaderType,const char *shaderCode){GLuint shaderglCreateShader(shaderType);glShaderSource(shader,1,&shaderCode,NULL);glCompileShader(shader);GLint compileResultGL_TRUE;glGetShaderi…

css阴影属性_第三场阴影场与属性访问器接口

css阴影属性这是“ 影子字段与属性访问器”界面的 第3轮 。 如果您是新手,但不确定要怎么做,请查看我以前的文章或关于开发JavaFX应用程序时节省内存的第一篇文章 。 作为Java开发人员,我主要关心的是在开发JavaFX域模型时在性能 &#xff0c…

js if判断多个条件_JS条件判断小技巧(一)

经常code review,我发现JS newbie很容易写出一堆冗长的代码。今天就列几个比较常见的“解决之道”,看看如何减少JS里的条件判断。提前返回,少用if...else“if...else是编程语言的精华。——鲁迅”但是过多的嵌套,还是挺令人抓狂的…

【Android OpenGL ES 开发 (四)】纹理相关(一)

纹理贴图的原理 1.作用:可以用来渲染视频。 2.纹理坐标 生成OpenGL中的纹理对象 1.像素数据想要绘制出来需要先变成纹理 2.创建纹理放在GPU上 GLuint CreateTexture2D(unsigned char *pixelData,int width,int height,GLenum type) {GLuint texture;glGenTextu…

python selenium循环判断元素是否存在_检查Python Selenium是否存在元素

我有一个问题-我正在使用Selenium(firefox)Web驱动程序打开网页,单击一些链接等,然后捕获屏幕截图。我的脚本可以从CLI正常运行,但是通过cronjob运行时,它并没有通过第一个find_element()测试。我需要添加一些调试,或一…

jmx 替代_使用JMX作为Ganglia的现代替代品进行CLDB监视

jmx 替代有许多选项可用于监视MapR集群的性能和运行状况。 在本文中,我将介绍使用Java管理扩展(JMX)监视CLDB的鲜为人知的方法。 据最受尊敬的MapR数据工程师之一,Akihiko Kusanagi称,与使用Ganglia相比,使…

WPScan安全建议和防护

加固WordPress安全性 保护WordPress网站的安全性至关重要,因为它是全球最受欢迎的内容管理系统之一,也是攻击者经常瞄准的目标。本文将深入探讨如何加固WordPress安全性,包括实施强密码策略、保持更新、使用可靠的主题和插件、限制登录尝试、…

red hat安装宝塔_如何在几分钟内安装Red Hat Container Development Kit(CDK)

red hat安装宝塔作为负责开发容器化应用程序提供的可能性的应用程序开发人员或架构师,将所有工具组合在一起以帮助您入门时几乎没有帮助。 到现在。 红帽容器开发套件(CDK) 安装变得简单! 红帽提供了一个容器开发套件&#xf…

python收集数据程序_用Python挖掘Twitter数据:数据采集

原标题:用Python挖掘Twitter数据:数据采集作者:Marco Bonzanini 翻译:数盟这是7部系列中的第1部分,注重挖掘Twitter数据以用于各种案例。这是第一篇文章,专注于数据采集,起到奠定基础的作用。Tw…

【FFMPEG中PTS与DTS统一转换为毫秒】

对于PTS和DTS 是两个非常重要的参数,在音视频同步时是必要的,为了方便使用,将二者统一为毫秒级别 static double r2d(AVRational r) {return r.den 0 ? 0 : (double)r.num / (double)r.den; } //转换为毫秒,方便做同步 AVPacke…

threejs 影子属性_影子场vs.属性访问器接口第2轮

threejs 影子属性如果你们还没有注意到Dirk Lemmerman和我之间的(轻松) 摊牌 ,那么让我快速提及一下我们是如何做到这一点的。 首先,Dirk创建了JavaFX技巧23:“ 为属性保存内存阴影字段 ”,以帮助应用程序开…

【OpenGL从入门到精通】Shader专题

详解GPU的工作流程 1.shader通常称为着色器,作用是把CPU上的点渲染出来。 2.shader是并行的。 3.流程:数据data (顶点数据) ----->VS(输入:data的顶点数据,输出:gl_Position的 vec4 顶点数据)----->光栅化处理…

python内存管理可以使用del_Python深入学习之内存管理

语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征。这里以Python语言为例子,说明一门动态类型的、面向对象的语言的内存管理方式。对象的内存使用赋值…

【OpenGL从入门到精通(六)】纹理对象与纹理坐标

1.在OpenGL想要显示一张图片,需要先绘制一个自定义的几何体。 2.把图片加载到纹理对象中 3.当进行纹理贴图时候,使用纹理坐标来设置纹理对象。 2.

yeoman_具有Spring Boot和Yeoman的单页Angularjs应用程序

yeoman我非常感谢yeoman之类的工具,这些工具提供了一种非常快速的方法来将不同的javascript库组合在一起成为一个一致的应用程序。 Yeoman提供了UI层,如果您需要开发服务层和静态资产的Web层,则打包的一种好方法是使用Spring Boot 。 我知道有…

python30行代码_仅利用30行Python代码来展示X算法

假如你对数独解法感兴趣,你可能听说过精确覆盖问题。给定全集 X 和 X 的子集的集合 Y ,存在一个 Y 的子集 Y*,使得 Y* 构成 X 的一种分割。这儿有个Python写的例子。X {1, 2, 3, 4, 5, 6, 7}Y {A: [1, 4, 7],B: [1, 4],C: [4, 5, 7],D: [3,…

LeetCode 203. 移除链表元素

原题链接 class Solution { public:ListNode* removeElements(ListNode* head, int val) {auto dummy new ListNode(-1);dummy->next head;for (auto p dummy; p; p p->next) {auto q p->next;while (q && q->val val) q q->next;p->next q…