顶点和着色器

​ 我们使用独立的点集合构建物体,都是使用顶点,之后会使用着色绘制图性,以及告诉OpenGLES如何绘制的小程序。

​ 片段着色器,即每个小的像素的渲染,

​ 顶点着色器确定所绘制图像的位置【空间位置】,举个例子就是需要画出一个桌子,我们需要知道这些点的位置。

​ 顶点汇聚成一个一个的图形,使用着色器绘制。

顶点着色器--->图元就是将图像的位置基本“画出来”然后将其光栅化,每个点每个点的进行显示出来。在这个时候设置颜色的亮度、颜色等操作。在顶点着色器阶段仅仅是确定位置。

桌子的绘制


​ 按照OpenGLES可以认识的形式创建,以下步骤

  • 介绍顶点

    一个顶点就是一个集合对象的拐点,这个点有很多的附加属性,最重要的就是位置,它代表了这个顶点在空间位置中定位。

  • 游戏中的桌子

    一个桌子有4个点,4个拐点,也就是有四个顶点,每个顶点在每个维度上都有一个坐标。

  • 在代码中定义顶点

    我们使用数组存储这些点,二维中必须有x和y轴的坐标。

    每个顶点的个数 每个点的坐标

    每个顶点分量的个数
    private static final int POSITION_COMPONENT_COUNT = 2;
    public MyRenderer() {
    // TODO Auto-generated constructor stub
    float []tableVertices = {
    0f,0f,
    0f,14f,
    9f,0f,
    9f,14f
    };
    }

    十进制表示每个顶点所在的位置。

  • 点、直接、三角形

    在OpenGLES中仅仅支持点、直线、三角形。我们都是同点,并告诉他们如何连接起来。通过三角形进行组成其他更加复杂的图像。顶点顺时针和逆时针表示图像的正反。

    /*更新代码如下*/
    0f,0f,
    9f,14f,
    0f,14f,
    0f,0f,
    9f,0f,
    9f,14f

    它的顺序是逆序排列,因为正面是逆序,反面是顺序。

  • 增加中间的线和点

    0f,7f,
    9f,7f,
    4.5f,2f,
    4.5f ,12f

    顶点的数据是浮点型,不是双精度的。我们使用十进制来表示这些存储的位置,这些数组通常就是顶点的属性。

    我们无论什么时候需要使用都需要将他们使用点、直接、三角形把它组合出来。

    使得数据可以被OpenGLES存取

    ​ 顶点定义完成了,但是代码和顶点,使用了不同的代码,

    • Java代码运行在虚拟机上,它是不可以访问本地的数据的,除了特殊的命令。并且虚拟机会检测无用的变量等,进行垃圾回收掉的。

    • OpenGLES运行在本地硬件中,没有虚拟机,也没有垃圾回收等操作。那么画图的时候,GPU如何获取到点的信息。

      处理方法:

      • 二者需要通信就需要使用JNI,这样就可以进行通信,

      • 通过改变内存分配方式,使用java的特殊类,在本地开辟空间,并将内存中的数据复制到这片内存,不受垃圾回收机制的控制

    内存从java堆复制到本地堆,使用java中特殊的类在本地中分配一块内存,并将数据复制到本地中,本地内存可以被本地环境变量存取,而不受垃圾回收机子管控。

    • 代码如下

      //顶点的个数
      private static final int BYTES_PER_FLOAT = 4;
      //复制到本地存储的位置
      private final FloatBuffer vertexData;

      ByteBuffer.allocateDirect(BYTES_PER_FLOAT*tableVertices.length).order(ByteOrder.nativeOrder())创建一个本地的内存。将数据变为本地的方式。

      .asFloatBuffer():将数据变为FloatBuffer,因为我们不愿去操作一个单字节,所以输出为Float的形式。

      vertexData.put(tableVertices):将数据从虚拟机复制到本地内存区。当使用完毕之后,就会释放本块内存。

**总结:**在本地开辟空间,将数据复制进去,以Float的方式输出。开辟空间的大小是由数组的长度*每个数组的子节点组成的大。

##### 引入管道

----------

将顶点坐标从虚拟机复制到本地内存中,需要将它们传入到管道。就需要使用着色器,着色器告诉图像处理单元,如何出理这些数据。

顶点着色器:每个顶点的最终位置,每个顶点都会执行一次,一旦位置确定了,就可以吧这些点的集合组装成点、直线、以及三角形。

片段着色1器:将每个点、三角形、直接形成最终的颜色,对于每个片段,都会执行一次。

颜色形成后就会将其写入到缓冲区中,最终显示到屏幕上。
  • 创建一个顶点着色器

    创建位置:raw文件夹中。

  • 写如下内容

    //每个顶点都是一个属性,所以这里使用是Attribute
    //类型是vec4,代表4个坐标系x,y,z,w
    attribute vec4 a_Position;

    void main()
    {
    gl_Position = a_Position;
    }

    每个顶点都会执行这个顶点着色器,在这个里面是有a_position来接收属性值,并将值给特殊变量gl_postion,attribute 就是设置属性值的。它的作用就是将前面设置的位置属性,设置到这个里面。gl_PositionJ就是最终的位置。

片段着色器

  • 光栅化技术

    屏幕上成千上万小的独立的部件组成,他们成为像素,光栅化就是吧点、直线和三角形分解成小分段,他们可以映射到屏幕上,构成一幅图像,

  • 片段着色器的作用就是每个片段使用的颜色是什么,基于图元的每个片段,都会调用一次

  定义了精度
precision meduimp float;
 
uniform vec4 u_color;
 
void main()
{
fl_FragColor = u_Color;
}

定义精度:

​ lowp、meduimp、highp分别是低精度、中等精度、高精度,在顶点中的精度是很高的使用了默认的高精度。

片段着色器uniform vec4 u_color;使用了uniform,他会使得每一个顶点使用同一个值,除非我们去改变他

他负责每一块片段的颜色,颜色有四种颜色组成。


总结:

· 将数据加入到本地内存中

· 创建着色器

1.x执行的流程

基本处理 :为顶点、纹理和颜色数据的准备,并且制定绘制方式

顶点缓冲:可要可不要,如果顶点固定就可以加载到缓存中,这样可以较少IO的消耗

变换和光照:对顶点变换以及设置光照等计算

图元装配:通过顶点将数据组装成为一个完整的图像

图元处理:就是裁剪,这个过程会增加或者减少点,根据具体情况而定产生原因就是在根据角度的不同,我们一次看不清全部的图像,所以会出现这样的问题

光栅化:在显示数据的时候,我们显示的是二维,但是图像是三维,可以通过投影的方式,将图像进行投影出来,几何物体一般由矢量图和标量图,变量图由一个小的块显示出来的,光栅化的目的就是将图元变为一个个小的块

纹理环境和颜色求和:这一部分进行纹理采样,颜色求和

雾:通过当前的根据参数设置雾参数

Alpha测试:他会检测每个片元的alpha值,符合要求的采会进入下一段。

裁剪空间:会检测是否在视口内部,在进入下一阶段,不在就不会进入下一个阶段

深度测试:会进行比较片元的深度,小的进入下一个阶段,大的就会抛弃

摸版测试:将绘制区域限定在一个范围内

颜色混合缓冲:开启alpha测试之后,会将上一阶段的与缓冲中的片源混合,否则会覆盖缓冲区中的

抖动:使用少的颜色 模拟出宽的颜色,使得其更加的丰富,比如白和黑之间的灰。

帧缓冲:openGLES中并不会直接的将物体绘制出来,而是先在缓冲中进行绘制,绘制完之后在将结果显示,所以每次绘制新的一个都需要清除缓存。

2.x的执行流程

基本处理 :为顶点、纹理和颜色数据的准备,并且制定绘制方式

顶点缓冲:可要可不要,如果顶点固定就可以加载到缓存中,这样可以较少IO的消耗


变换和光照:对顶点变换以及设置光照等计算

变为了

顶点着色器


图元装配:通过顶点将数据组装成为一个完整的图像

图元处理:就是裁剪,这个过程会增加或者减少点,根据具体情况而定产生原因就是在根据角度的不同,我们一次看不清全部的图像,所以会出现这样的问题

光栅化:在显示数据的时候,我们显示的是二维,但是图像是三维,可以通过投影的方式,将图像进行投影出来,几何物体一般由矢量图和标量图,变量图由一个小的块显示出来的,光栅化的目的就是将图元变为一个个小的块


纹理环境和颜色求和:这一部分进行纹理采样,颜色求和

雾:通过当前的根据参数设置雾参数

Alpha测试:他会检测每个片元的alpha值,符合要求的采会进入下一段。

变为了

片元着色器


裁剪空间:会检测是否在视口内部,在进入下一阶段,不在就不会进入下一个阶段

深度测试:会进行比较片元的深度,小的进入下一个阶段,大的就会抛弃

摸版测试:将绘制区域限定在一个范围内

颜色混合缓冲:开启alpha测试之后,会将上一阶段的与缓冲中的片源混合,否则会覆盖缓冲区中的

抖动:使用少的颜色 模拟出宽的颜色,使得其更加的丰富,比如白和黑之间的灰。

帧缓冲:openGLES中并不会直接的将物体绘制出来,而是先在缓冲中进行绘制,绘制完之后在将结果显示,所以每次绘制新的一个都需要清除缓存。

openGLES(二)的更多相关文章

  1. OpenGLES入门笔记二

    #import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> #import <OpenGLES/ES2/gl.h& ...

  2. OpenGLES入门笔记一

    学习地址:http://www.raywenderlich.com/3664/opengl-tutorial-for-ios-opengl-es-2-0 中文翻译:http://www.cnblogs ...

  3. Opengles 管线编程介绍

      OpenGL ES 2.0可编程管道 上图橙色部分(Vertex Shader和Fragment Shader)为此管道的可编程部分.整个管道包含以下两个规范: 1)         OpenGL ...

  4. 转 cocos2dx内存优化 (之二)

    一.cocos2dx之如何优化内存使用(高级篇) 本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=93 一.内存优化原则 为了优化应用内存,你应该知道 ...

  5. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  6. 一:cocos2dx 3.2 尚不支持cubeMap?二:光照需要shader实现

    一: cocos2dx 3.2 尚不支持cubeMap? 因为需要调用cocos2dx 封装的bindTexture的方法,发现只能绑定2DTexture,对Cube_Map无能无力.顿感累觉不爱…… ...

  7. OpenGLES 与 WebGL 中顶点属性的组织格式的误解 - 一个不好笑的笑话

    版权声明:本文为博主原创文章,未经博主同意不得转载.转载联系 QQ 30952589.加好友请注明来意. https://blog.csdn.net/sleks/article/details/289 ...

  8. 在Android中使用OpenGL ES进行开发第(二)节:定义图形

    一.前期基础知识储备笔者计划写三篇文章来详细分析OpenGL ES基础的同时也是入门关键的三个点: ①OpenGL ES是什么?与OpenGL的关系是什么?——概念部分 ②使用OpenGLES绘制2D ...

  9. 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态

    最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...

随机推荐

  1. 浅述html5和web app

    题外话:最近跟不少产品解释技术术语,比如脚本.数据库.H5等等,我一般会把他们当成稍微了解这些技术的人,用专业的语言描述一遍,然后用通俗的语言解释一遍,最后举例子解释一遍. 肯定有人问,你把流程反过来 ...

  2. mysql InnoDB加锁分析

    文章转载自:http://www.fanyilun.me/2017/04/20/MySQL%E5%8A%A0%E9%94%81%E5%88%86%E6%9E%90/ 以下实验数据基于MySQL 5.7 ...

  3. 紫书 例题 9-11 UVa 1331 (最优三角形剖分)

    设置f(i, j)为点i, i + 1 --j所组成的多边形. 那么可以枚举中间点k, 得f(i, j) = min{s(i, j, k), f(i, k), f(k, j) | i < k & ...

  4. 洛谷 P1460 健康的荷斯坦奶牛 Healthy Holsteins

    P1460 健康的荷斯坦奶牛 Healthy Holsteins 题目描述 农民JOHN以拥有世界上最健康的奶牛为傲.他知道每种饲料中所包含的牛所需的最低的维他命量是多少.请你帮助农夫喂养他的牛,以保 ...

  5. 用Shell脚本过滤Hadoop中不能訪问的节点

    近期使用的一个集群hp1,由于维护集群的人不给力.节点总是过一段时间就掉一两个.今天发现重新启动hadoop时,HDFS已经进入保护模式了. 决定把slaves节点中的无法訪问的节点所有过滤掉.所以写 ...

  6. julia/pyplot 绘图加入标签和标题

    julia 调用matplotlib.pyplot 须要先using pycall 先安装pycall Pkg.add("PyCall") 然后吧. . . 上代码把:(应该是通俗 ...

  7. 论Nim中的 proc 和 method

    在Nim中.proc 是定义过程的keyword.method 是定义方法的keyword.它们之间根本的差别是proc定义的过程是静态绑定.method定义的方法是动态绑定.谈到静态绑定.动态绑定又 ...

  8. call() 和 apply() 的作用和区别

    call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就 ...

  9. SQL优化工具SQLAdvisor使用(转)

    一.简介 在数据库运维过程中,优化SQL是业务团队与DBA团队的日常任务.例行SQL优化,不仅可以提升程序性能,还能够降低线上故障的概率. 目前常用的SQL优化方式包括但不限于:业务层优化.SQL逻辑 ...

  10. layoutParams-动态更改某个控件的margin

    其实它的方法也非常的简单,如下 LinearLayout.LayoutParams layoutParams = (LayoutParams) bt1.getLayoutParams(); int a ...