OpenGLのプログラミングガイド(2)

図1は、OpenGLの上の厳しい規制がエッジ共有ありますピクセルの共有エッジが両方の同僚によって覆われているので、計算を点灯することによって影響されなかったため、1);

                            2)画素値のエッジを共有し、それは、複数の三角形の照明計算によって影響を受けることができません。

 

図2に示すように、正および負のポリゴンの存在、明確ポリゴンの頂点を観察するために、モードを描くglPolygonMode(GLenum面、GLenumモード)を無効にすることができるが設けられています

   顔がGL_FRONT_AND_BACKにする必要があり、モードはGL_POINT、GL_LINE、GL_FILL、デフォルトすることができGL_FILLの塗りつぶしモードです。

 

3、OpenGLのキャッシュタイプ

 

 

 

4、データがキャッシュに書き込まれ、

 1)ボイドglBufferData(GLenum対象、GLsizeiptrサイズ、CONST GLvoid *データ、GLenumの使用)使用した場合、キャッシュメモリにライトデータがデータnullptr Aである場合、メモリにのみ割り当てられ、割り当てられています。

 2)ボイドglBufferSubData(GLintptrオフセットGLenumターゲット、GLsizeiptrサイズ、CONST GLvoid *データ)全体に対する書き込みデータバッファ上に、この方法は、単にオフセットから始まる書き込みデータサイズの大きさに始めています。

 あなたが唯一のオブジェクトが値を持っているためにキャッシュデータをクリアしたい場合は3)、以下の方法を使用することができます

   空glClearBufferData(GLenumターゲット、GLenum internalformat、GLenumフォーマット、GLenumタイプ、CONST GLvoid *データ)

   void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const GLvoid* data)

 4)缓存中的数据可以互相拷贝

   void glCopyBufferSubData(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size)

 

5、void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data)这个方法能够将绑定的缓存目标中的数据读取到data指定的内存中。

 

6、上面介绍的众多方法都有一个问题,都会对指定的数据进行一次拷贝,下面的这个方法将会返回一个指向目标内存的指针

  void* glMapBuffer(GLenum target, GLenum access)

  GLboolean glUnmapBuffer(GLenum target) 如果在映射后target没有发生损坏,将会返回GL_TRUE;发生损坏的原因通常与系统相关,例如屏幕模式发生变化,这将影响图形内容的可用性。

 

7、使用glBufferData 或 glBufferSubData 返回后,可以对返回的内存区域中的数据进行任何操作。也就是说,这些函数在完成后不能与内存区域再有任何瓜葛,因此需要采用数据拷贝的方式。如果使用glMapBuffer,返回的指针是OpenGL端管理,调用glUnmapBuffer时,OpenGL依然管理这个指针指向的内存,而应用程序与这出内存已经没有任何瓜葛。这样的话即使数据需要移动或者拷贝,也是调用glUnmapBuffer之后才执行并且立即返回,而内容操作是在系统的空闲时间之内完成,不在受应用程序的影响。因此,OpenGL的数据拷贝操作与应用程序之后的操作实际上是同步进行的。

 

8、void* glMapBufferRange(GLenum target, Glintptr offset, GLsizeiptr length, GLbitfield access)是相对于上面有着更为严格访问限制的映射方式。

 

9、丢弃缓存数据,使得OpenGL能够完成一些优化工作,如内存紧密等

  void glInvalidateBufferData(Gluint buffer)

  void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, Glsizeiptr length)是唯一一个可以抛弃缓存对象中区域数据的方法。

 

10、绘制命令分为两种:索引形式与非索引形式。所谓的索引意图是在三角形顶点重复的时候通过使用顶点数组中索引来避免顶点数组找那个存在相同的顶点数据。

  void glDrawArrays(GLenum mode, GLint first, GLsizei count)

  void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)

  有许多的绘制命令都是通过以上两个实现的。

  存在两个特殊的绘制命令,它们的绘制参数不是从程序中得到,而是从缓存对象中获得,称之为间接绘制函数。

  1) void glDrawArraysIndirect(GLenum node, const GLvoid* indirect)

  使用它时,必须要将一个缓存对象绑定到GL_DRAW_INDIRECT_BUFFER上,它的特性与glDrawArraysInstanced完全一致。间接绘制缓存的 C 结构体形式如下

  typedef struct DrawArraysIndirectCommand_t

  {

        GLuint count;

        GLuint primCount;//表示多实例的个数

        GLuint first;

        GLuint baseInstance;//多实例顶点属性的偏移

  } DrawArraysIndirectCommand;

 

 2)void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid* indirect)

  它的特性与glDrawElements一致,使用限制也是一样的。

  typedef struct DrawElementsIndirectCommand_t

  {

        GLuint count;

        GLuint primCount;

        GLuint firstIndex;

        GLuint baseVertex;

        GLuint baseInstance;

  } DrawElementsIndirectCommand;

 

11、多实例渲染最大的不同在于需要启用多实例顶点属性 void glVertexAttribDivisor(GLuint index, GLuint divisor) 完成这项工作。divisor的值如果是0,那么该属性的多实例特性将被禁用,如果是其它值则是多实例点顶属性的间隔;index表示的是顶点属性的索引位置。vertex shader内存在对应实例id的内置变量 gl_InstanceID,从0开始累加,非多实例渲染时这个值一直保持为0。

 

おすすめ

転載: www.cnblogs.com/haihuahuang/p/12337890.html