OpenGL学习笔记

来源:互联网 发布:webgame 源码下载 编辑:程序博客网 时间:2024/06/06 13:14

OpenGL学习笔记

目录

  • OpenGL学习笔记
    • 目录
    • OpenGL 20实践
      • 第一章
        • 1安装工具
        • 3初始化OpenGL
        • 4创建Renderer类
      • 第二章 定义顶点和着色器
        • 34 点直线及三角形
        • 42 把内存从Java堆复制到本地堆
      • 第三章 编译着色器及在屏幕上绘图
        • 21 创建一个新的着色器对象
      • 第七章 用纹理增加细节
        • 22 理解纹理过滤
    • OpenGL ES 30编程指南
      • 第11章片段操作
        • 1缓冲区
        • 2片段测试
        • 6在帧缓冲区读取像素
      • 第12章帧缓冲区对象fbo

OpenGL 2.0实践

第一章

1.1安装工具

  • 每一帧绘制前清空屏幕是一种很好的做法,对于目前的GPU,不但不增加负担,还会避免很多问题

1.3初始化OpenGL

  • 需要在Activity中的onResume()onPause()中同步GLSurfaceViewonResume()onPause()

1.4创建Renderer类

  • RendereronSurfaceCreated()应该是在ActivityonResume()中调用GLSurfaceViewonResume()的时候调用,所以可能会调用多次
  • Renderer的回调方法均在一个单独的渲染线程中调用,只能在这个线程中调用OpenGL,在UI线程进行UI操作;两者的通信方式可以通过在UI线程中调用GLSurfaceView.queueEvent()给渲染线程传一个Runnable,或者在渲染线程中调用Activity.runOnUIThread()Runnable给主线程

第二章 定义顶点和着色器

2.3.4 点、直线及三角形

  • 在OpenGL里,只能绘制点、直线以及三角形

2.4.2 把内存从Java堆复制到本地堆

  • OpenGL是本地系统库用C写的,要想与其进行数据通信,数据要放在本地内存堆而非Java内存堆,两种实现方式:JNI和xxxBuffer(xxx为数据类型,例如Float)
  • 本地内存会随着进程结束被释放,但是如果开了很多的本地内存的话,则需要自己进行管理

第三章 编译着色器及在屏幕上绘图

3.2.1 创建一个新的着色器对象

  • OpenGL不会抛出异常,而是返回异常值,如0。可以用glGetError()查看是不是某个OpenGL的调用导致了错误

第七章 用纹理增加细节

7.2.2 理解纹理过滤

  • 对于最近邻过滤、双(三)线性插值、MIP贴图都没怎么看懂,后面有时间再查吧

OpenGL ES 3.0编程指南

第11章片段操作

11.1缓冲区

  • 有三种缓冲区:颜色(color)缓冲区,深度(depth)缓冲区,模板(stencil)缓冲区
  • 颜色缓冲区 有16位的(RGB565)也有32位的(RGBA8888),也有可能是双重缓冲,一个前台一个后台,前台显示后台渲染,更加流畅
  • 用glClear清除指定的缓冲区,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)。用来清除缓冲区的默认颜色、深度、模板值可以用glClearColor();glClearDepthf();glClearStencil()来设置

11.2片段测试

  • 剪裁测试:限定一个区域,进一步限定帧缓冲区中可以写入的像素
  • 模板缓冲区测试:模板缓冲区保存每个像素位置的模板值。模板测试通过指定像素位置的掩码条件,决定不同位置的新的片段是否可以通过测试,并决定是否更新模板值。
  • 深度测试:用于隐藏表面的消除,深度缓冲区保存渲染表面上每个像素与视点最近物体的距离值,比较新输入片段与颜色缓冲区原像素的距离值并决定是否通过测试

11.6在帧缓冲区读取像素

  • glReadPixels(x,y,width,height,format,type,*pixels)从帧缓冲区读取像素,pixels的数组大小应该是width*height*bytesPerPixel

第12章帧缓冲区对象(fbo)

  • fbo的作用在于把texture绘制在屏幕上之前,对texture进行预处理(我是这么理解的,不一定对)
  • 实现方式是创建一个fbo,把texture绑上去,然后激活fbo,之后一切的绘制就都是屏幕外以该texture为目标的了
  • 最后完成处理,把fbo关掉,然后就可以把处理好的texture画到屏幕上去
0 0