1、OpenGL对共享的边有严格的规定:1)共享边上的像素因为同事被两者所覆盖,因此不可能不受到光照计算的影响;

2)共享边上的像素值,不可能受到多于一个三角形的光照计算的影响。

2、多边形存在正面与反面,为了能够明显地观察多边形的顶点,可以使用void glPolygonMode(GLenum face,GLenum mode)设置绘制方式

face必须是GL_FRONT_AND_BACK,mode可以是GL_POINT、GL_LINE、GL_FILL,默认使用的是GL_FILL 填充模式。

3、OpenGL缓存类型

4、向缓存写入数据

1)void glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);是在分配缓存内存用的时候写入数据,如果data为nullptr,那么就是仅仅分配了内存。

2)void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);相对于上面整个缓冲地写入数据,这个方法只是从offset开始写入size大小的数据。

3)如果只是希望将缓存对象的数据清除为一个一直的值,可以使用如下方法

void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const GLvoid* data)

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。

OpenGL 编程指南 (2)的更多相关文章

  1. OpenGL编程指南(第七版)

    OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...

  2. 编译opengl编程指南第八版示例代码通过

    最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...

  3. VS15 openGL 编程指南 配置库 triangle例子

    最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...

  4. [转]OpenGL编程指南(第9版)环境搭建--使用VS2017

    1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...

  5. opengl编程指南

    第一章 opengl简单介绍 1.1 什么是opengl opengl是图形硬件的一种软件接口.        1>渲染(rendering)是计算机依据模型创建图像的过程. 2>模型(m ...

  6. OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)

    1. 先上代码 头文件glCommon.h #include <GL/glew.h> #include <GL/GL.h> #include <GL/GLU.h> ...

  7. OpenGl编程指南第7版(红宝书)环境配制

    环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/librar ...

  8. OpenGL编程指南(第九版) Tiangles 学习笔记

    ////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...

  9. 《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法

    解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...

  10. Opengl编程指南第二章:状态管理、几何绘图

    //http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...

随机推荐

  1. redis学习三连奏,绝对让你彻底吃透分布式架构精髓

    2020年初,远程办公与直播授课成为国民刚需,腾讯因此免费开放可支持300人同时在线会议的“腾讯会议”.一时之间,这款软件的用户呈爆发性增长,据统计,腾讯会议一天就有近较100倍日常的会议数量. 谈及 ...

  2. codechef Scoring Pairs

    难度 \(medium-hard\) 题意 官方中文题意 做法 很显然是可以通过计算常数个\(sum(A,B)=\sum\limits_{i=0}^A \sum\limits_{j=0}^B scor ...

  3. Vue的H5页面唤起支付宝支付

    目前项目中比较常用的第三方支付无非就是支付宝支付和微信支付.下面介绍一下Vue中H5页面如何使用支付宝支付.其实很简单的,只不过是调自己后台的一个接口而已(后台根据支付宝文档,写好支付接口). 触发支 ...

  4. STL-string用法

    #include <string> #include <iostream> #include <cstring> #include <algorithm> ...

  5. 2-1.了解Pod对象

    1.Pod参数定义 # 必填,版本号 apiVersion: string kind: Pod # 必填,元数据 metadata: # 必填,Pod对象的名称(命名规范需要符合RFC 1035规范) ...

  6. JS实现简易计算器的7种方法

    先放图(好吧比较挫) 方法一:最容易版 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta ...

  7. java文本文件加密

    加密方法是通过输入流对源文件字符逐个读取,对其读取到字符的ascll值进行异或运算,并将其放入新文件中,解密时只要用相同的密钥进行ascll异或运算并向新文件输出即可,即对文件首次用该程序处理为加密, ...

  8. 对vulnhub靶机lampiao的getshell到脏牛提权获取flag

    前言: vulnhub里面的一个靶场,涉及到drupal7 cms远程代码执行漏洞(CVE-2018-7600)和脏牛提权. 靶机下载地址:https://mega.nz/#!aG4AAaDB!CBL ...

  9. BZOJ5137&&lg4081(广义后缀自动机,set启发式合并)

    BZOJ5137&&lg4081(广义后缀自动机,set启发式合并) 题面 自己找去 HINT 给定多个文本串,让你查询每个文本串中有多少个本质不同的子串且这个子串只出现在当前这个文本 ...

  10. 报错Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/...

    首先我的jdk是11.05的 这个是由于: 这个是 由于缺少了javax.xml.bind,在jdk10.0.1中没有包含这个包,所以我自己去网上下载了jdk 8,然后把jdk10.0.1换成jdk ...