RenderScript 学习

 

                     RenderScipt 学习总结

Renderscript(渲染脚本)是Google全新加入的一个标志性功能,是一个新的 API, 旨在带来更高的性能的下级 API 给开发者,它带有高性能的 3D 渲染和计算操作,这可以很大程度的提高他们的应用程序的性能

Renderscript 已经被使用到了一些东西中,比如 Honeycomb 的动态壁纸中以及复杂的 YouTube 和 Book 应用中,这个内建的 Renderscript 是非常出色的,就像 Google 说的“接近极端”,它将提高你的设备上执行本地代码的性能。从目前的情况来看这是非常不错的,与现存的 NDK 不同,最终产品将可以跨平台工作。(以上介绍均来自网上)更多介绍请google。

光栅化:

确定最佳接近图形的像素集合,并用指定属性写像素的过程!也称为扫描转化。   OpenGL红宝书上解释为:把物体的数学描述以及与物体相关的颜色信息转换为屏幕上的像素,这个过程称为光栅化。

 

//解释什么是Allocation ,Type ,Element ,

Android自2.1以后增加了Renderscript以加强图像和3D方面的处理能力和速度。RenderScript简单的讲,可以概括为:

•什么是RenderScript 

–提供了一套API,封装了着色器语言的使用和配置 

–分为Java,JNI,Native三层 

–Engine  <-  Script–Script执行前被编译成机器码 

•干什么? 

–帮助书写更加高效的OpenGL程序 

–利用GPU的计算能力 •着色器语言实际是对GPU的高级编程 

但是在讲RenderScript之前还是要简略介绍一下着色器语言,因为RenderScript其实主要是为了更便捷的使用它

Shader(着色器)是用来实现图像渲染的用来替代固定渲染管线的可编辑程序,它分为 

–顶点着色器 •对每个顶点进行坐标转换,法向量转换,光照计算,将结果保存 

–片断着色器 •对每个片断进行颜色计算 

目前主流的分类 –OpenGL - GLSL–Direct3D - HLSL–Nvidia– CG

RenderScript 分为Java和Native两层,Java只是对Native的封装,因此我们只需要关注native的结构和运行,至于Java的接口使用比较繁琐,需要另文说明。下面就是RenderScritp的简要结构和个不部件之间的关系。

 

Context是一个独立的线程,维护着整个运行环境的上下文的运行状态。Context中包含至少一个Script对象,该对象首先根据设置的脚本文件路径读取脚本文件,然后将脚本通过libacc(一个小的c编译器)进行编译,将脚本中的固定符号(init和main())填充进自己固定的函数指针。Context这个线程会定时调用Sctipt的run()方法,进而执行Script中早已填充好的函数指针,从而完成脚本的运行。

但是只有脚本本身是远远不够的,它只能完成C语言的一个子集的功能。更多的和图像,3D有关的操作还要借助其他模块完成。整个辅助模块可以分为两组:

第一组是 存储类

第二组是 着色器处理程序类

存储类主要用来进行数据的存储和上层java的交换,包括Type,Element,Allocation。Element可以理解为一个结构体,ru

struct {

int a

} A;

就可以是一个element。Type是对这个结构体的类型的命名,A 就是这个type。但光有type和element不行,我们还需要切实的实例,而这个实例就是Allocation:

  struct A AllocationOfA = new struct A{3};
AllocationOfA就是一个Allocation。

在RenderScript运行之前,必须的Allocation要分配好,他们可能是定点坐标,可能是纹理,也可能是用户的数据。

 

着色器处理程序类分为4类:ProgramFragment ProgramFragmentStore ProgramVertext Mesh。

ProgramFragment对应片断处理程序,对光栅化的每一个片断做独立的处理,包括映射纹理点,混合,着色等。

ProgramFragmentStore主要负责一些跟片断处理相关的辅助功能,如设置混合模式等。

ProgramVertext对应顶点处理程序,对每一个顶点做独立的处理,包括视景投影变换,法线变换等。

Mesh又叫网格,是方便对一组顶点的处理的类。

以上四个类最终都会被调用setupGL或render这样方法,在这些方法中讲用户的配置转换为OpenGL的具体操作序列。如果运行在GLES2.0上,这些OpenGL操作会使用真正的着色器语言来实现,这也是RenderScript最大功能的体现之一。

无论是存储类还是处理器类都是被context创建出来的,他们的声明周期也为context控制。Script在运行过程中,会从context中获取这些实例,以读写数据和执行相关的OpenGL操作。

RenderScript提供了一系列函数和实现来实现存储类和处理器类的操作,包括读allocation,写allocation,绑定处理器实例,以及一些绘图操作。用户在编写script的时候可以以预定和“库函数”方式调用这些函数。Script编译的时候这些“库函数”的符号就被解析成RenderSctipt中真正的对应函数地址。

最后我们可以总结一下renderscript的运行步骤

•Java

- 创建和设置 

    –创建RenderScriptContext 

    –设置Surface

        –创建和设置处理器 

                  •ProgramVertext  - 顶点处理器 

          •ProgramFragment– 片段处理器 

          •ProgramFragmentStore– 和片段处理器相关的工作,如混合模式 

                  •Allocation – Script中用到的变量 

               –设置script src,绑定处理器和变量 

•Native

– 编译和执行 

–编译脚本,fullfill main函数指针 

–处理器 -> opengl操作(设置,创建实际处理器程序并连接)

–在线程中循环执行main函数  

Invoke 的使用

 

 

      

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值