OpenGL 编程指南 (9.2)

1、使用glDrawArraysInstanced与glDrawElementsInstanced这类的函数使用gl_InstanceID进行不同变化的实例化,实质上是使用一批顶点数据执行多次整个渲染管线,如果启用细分可能给GPU增加潜在(为啥是潜在?不是直接的吗,还有啥东东没有get到)负担。几何实例化,可以节省几何着色器之前的流程,这两种实例化可以同时使用。在shader中通过invocations布局限定符来指定执行次数,内建变量gl_InvocationID代表着执行索引,支持的最大值通过GL_MAX_GEOMETRY_SHADER_INVOCATIONS来获取,不小于32

  layout (triangles, incovations = 4) in;

 

2、多视口使用的内建变量gl_ViewportIndex,对窗口进行指定参数后的分割。当程序存在几何着色器时它们会被存储到gl_ViewportIndex对应的数组中去(gl_ViewportIndex只是数组对应的索引而已,当要使用第二个视口是执行gl_ViewportIndex = 1后进行数据操作即可),不存在是使用第一个视口信息。

  void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)

  void glViewportIndexedfv(GLuint index, const GLfloat* values)

  void glDepthRangeIndexed(GLuint index, GLclampd n, GLclampd f)//指定窗口z坐标的范围,近平面与远平面

  void glViewportArrayv(GLuint first, GLsizei count, const GLfloat* values)

  void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble* values)

 

 

 

3、视口多重剪切

  void glScissorIndexed(GLuint index, GLint x, GLint y, GLsizei width, GLsizei height)

  viod glScissorIndexedv(GLuint index, const GLint* values)

  void glScissorArrayv(GLuint first, GLsizei count, const GLint* values)

 

4、分层渲染

  渲染帧缓冲时,可以使用2D数组纹理作为颜色附件然后使用geometry shader渲染到数组中的一个切片上。使用帧缓冲的分层附件有一个限制,所有附件都必须分层且同层换成的附件必须相同的文理类型。那么对于2D纹理数组与cube map纹理需要同时使用的情况下就无能为力了。因此可以使用3D纹理数组在glFramebufferTextureLayer的帮助下完成工作,此时需要向内建变量gl_Layer写入需要写入数据的切片索引。

 

 

 

需要注意的是,在OpenGL4.3前,如果想在片元着色器中使用gl_ViewportIndex 与 gl_Layer需要自行定传递。

 

posted @ 2020-03-09 12:04  no-being  阅读(341)  评论(0编辑  收藏  举报