openGL ES 2.0 fragment shader and framebuffer

来源:互联网 发布:网络机房维保 编辑:程序博客网 时间:2024/05/01 00:49

chapter 10

 

1. 内建变量:

gl_FragColor 用于输出,可以不写入该变量,比如你只想修改depth buffer

gl_FragCoord 只读变量,值 (x, y, z, 1/w)

gl_FrontFacing 内建只读变量,如果该fragment为三角形正面的一部分,该值 为真

gl_PointCoord:只读变量,值 为point sprite的纹理坐标

 

2. 内建常量:

const mediump int gl_MaxTextureImageUnits = 8;

系统支持的最大纹理单元个数

const mediump int gl_MaxFragmentUniformVectors = 16;

最大vec4 为单位的uniform变量存储大小

const mediump int gl_MaxDrawBuffers = 1;

最大可写入buffers,目前只支持1个

 

 

 

==========================

chapter 11

 

1.framebuffer and renderbuffer区别

render buffer 是一个实实在在的buffer,申请后,可以用来作为color buffer, depth buffer, stencil buffer.

framebuffer 是clolor buffer, depth buffer, stencial buffer 指针的集合,The only 2D image that can be attached to the

stencil attachment point of an FBO is a renderbuffer object that stores

stencil values.

 

2. framebuffer中的color buffer到底是用texture还是用render buffer?

推荐使用render buffer, 理由如下:1.某些格式不能保存为纹理对象,只能保存为render buffer。2.如果照片不是用作纹理, 保存为render buffer可以加快处理速度

 

3. Framebuffer Objects 和 EGL surface的区别:1. 像素所有者测试,frame buffer永远返回真2,系统支持双buffer的 suface,不过只支持单buffer的 frame buffer 3.stencil 和 depth buffer可以在多个frame buffer中共享,而 EGL surface不行。 4 系统提供的EGL surface支持multisample buffers(?)

 

4. 产生一个render buffer, frame buffer

void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)

void glGenFramebuffers(GLsizei n, GLuint *ids)

0 号 frame buffer由系统保留作系统frame buffer,即上面说的EGL surface

 

5. 如何使用render buffer

.先绑定void glBindRenderbuffer(GLenum target, GLuint renderbuffer)

.glRenderbufferStorage指定格式和大小

如果render buffer被attache to frame buffer,可以在attach 之后指定render buffer的格式

 

6. 如何使用frame buffer

.先绑定void glBindFramebuffer(GLenum target, GLuint framebuffer),同上,绑定的framebuffer可以没有生成,只要是未使用的frame buffer就可以,绑定成功后,成为渲染上下文的当前framebuffer。下面几个状态关联到一个frame buffer

Color attachment point

Depth attachment point

Stencil attachment point

Framebuffer completeness status

.检测framebuffer 是否complete glCheckFramebufferStatus

 

7. 删除一个render buffer时,如果该buffer 绑定在一个framebuffer上,并且 该 framebuffer是当前绑定buffer,则系统会自动datach 该render buffer,如果framebuffer 不是当前绑定buffer,则用户负责datach 该framebuffer