OpenGL(六)-- 渲染技巧:正背面剔除、深度测试、多边形偏移、颜色混合 通过一个基础案例来了解这些渲染技巧:正背面剔除、深度测试、多边形偏移。应该更容易理解。...所以在OpenGL中深度值是这样计算的: ? far、near是提供投影矩阵设置时使用的可见视图截锥的远近值。公式中的Z值也是矩阵变换后的值。...从公式中可以发现2点: 深度值在【0,1】之间 值越⼩小表示越靠近观察者,值越⼤大表示远离观察者 整个过程就叫做深度测试(Z-buffer)。 相对应的颜色缓冲区和深度缓存区是一一对应的。...在进行深度测试的时候,深度值比较大的会被丢弃,相同的颜色缓冲区也会跟着进行修改。以保证深度缓存区和颜色缓存区中是同一个点的信息。...让观察者尽量远近裁剪面,这个位置可以回头看看深度测试的那个公式,也就是将公式中的near变大,近异步提高计算精度。 使用更高位数的深度缓存区。
YUV 渲染原理 前面文章一文掌握 YUV 图像的基本处理介绍了 YUV 常用的基本格式,本文以实现 NV21/NV12 的渲染为例。...前文提到,YUV 图不能直接用于显示,需要转换为 RGB 格式,而 YUV 转 RGB 是一个逐像素处理的耗时操作,在 CPU 端进行转换效率过低,这时正好可以利用 GPU 强大的并行处理能力来实现 YUV...OpenGLES 常用纹理的格式类型 GL_LUMINANCE 纹理在着色器中采样的纹理像素格式是(L,L,L,1),L 表示亮度。...GL_LUMINANCE_ALPHA 纹理在着色器中采样的纹理像素格式是(L,L,L,A),A 表示透明度。...YUV 渲染实现 YUV 渲染步骤: 生成 2 个纹理,编译链接着色器程序; 确定纹理坐标及对应的顶点坐标; 分别加载 NV21 的两个 Plane 数据到 2 个纹理,加载纹理坐标和顶点坐标数据到着色器程序
例如,在深度学习中常用的ONNX交换模型就是使用.proto编写的。我们可以通过多种前端(MNN、NCNN、TVM的前端)去读取这个.onnx这个模型,但是首先你要安装protobuf。...关于mediapipe的详细介绍在另一篇文章。...另外,不同目录内的.cc文件会引用相应目录生成的.pb.h文件,我们需要生成的.pb.cc和.pb.h在原始的目录中,这样才可以正常引用,要不然需要修改其他源代码的include地址,比较麻烦。...CLion中Cmake来编译proto生成的.pb.cc和.pb.h不在原始目录,而是集中在cmake-build-debug(release)中,我们额外需要将其中生成的.pb.cc和.pb.h文件移动到原始地址...正确修改cmake 对于这种情况,比较合适的做法是直接使用命令进行生成。
,它使用C++中实现的,并着重强调简单易用性性(即,处理和可视化3D数据可以通过API调用的几行来实现),Easy3D的贡献有三个方面: (1)可以表示常见3D数据(即点云、曲面网格、多面体网格和图形)...•一系列广泛使用的算法,例如,点云法线估计/重新定向、泊松曲面重建、RANSAC、网格简化、细分、平滑、参数化和重划分。...•一系列渲染技术,例如点/线视点替用、环境光遮挡(SSAO)、硬阴影(阴影贴图)、软阴影(PCSS)、眼罩照明(用于渲染没有法线信息的点云)和透明度(平均颜色混合、双深度剥离)。...•OpenGL和GLSL的高级封装,方便高效地进行渲染(基于现代且更快的可编程着色器样式渲染,即无需固定函数调用)。用户代码不需要接触OpenGL的低级API。...从Easy3D库中创建的一个方便的工具Mapple,用于渲染和处理3D数据。
创建 aux库是为了学习和编写 OpenGL 程序,它更像是一个用于测试创意的预备基础接管。Aux 库在 windows 实现有很多错误,因此很容易导致频繁的崩溃。...在跨平台的编程实例和演示中,aux 很大程度上已经被 glut 库取代。OpenGL 中的辅助库不能在所有的 OpenGL 平台上运行。...由于 glut中的窗口管理函数是不依赖于运行环境的,因此 OpenGL 中的工具库可以在 XWindow,Windows NT, OS/2 等系统下运行,特别适合于开发不需要复杂界面的 OpenGL 示例程序...8.其他扩展库 这些函数可能是新的 OpenGL 函数,并没有在标准 OpenGL 库中实现,或者它们是用来扩展已存在的 OpenGL 函数的功能。...扩展由 SGI 维护,在 SGI 网站上列出了目前公开的已注册的扩展及其官方说明书。扩展源由扩展函数的后缀来指明(或使用扩展常量后缀)。
首先简单介绍下 strpos 函数,strpos 函数是查找某个字符在字符串中的位置,这里需要明确这个函数的作用,这个函数得到的是位置。 如果存在,返回数字,否则返回的是 false。...而很多时候我们拿这个函数用来判断字符串中是否存在某个字符,一些同学使用的姿势是这样的 // 判断‘沈唁志博客’中是否存在‘博客’这个词 if (strpos('沈唁志博客', '博客')) {...沈唁志博客’中的第 0 个位置;而 0 在 if 中表示了 false,所以,如果用 strpos 来判断字符串中是否存在某个字符时 必须使用===false 必须使用===false 必须使用=...==false 重要的事情说三遍,正确的使用方式如下 // 判断‘沈唁志博客’中是否存在‘博客’这个词 if (strpos('沈唁志博客', '博客')===false) { // 如果不存在执行此处代码...原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:在PHP中strpos函数的正确使用方式
光栅化的任务主要是决定每个渲染图元中的哪些像素应该被绘制在屏幕上 ?...注1:并非所有显卡都支持Alpha测试特性,使用前需要检查显卡是否有该能力 注2:由于大量片元会在该阶段舍弃,Alpha测试可提高含大量透明物件场景的性能 • 模板测试: ?...注1:深度值范围(D3D:[0.0, 1.0] OpenGL:[-1.0, 1.0]),建立深度缓冲区位数越多,则深度值的精度就会越高;其初始值为清理深度缓冲区的所设置的值 注2:关闭了深度测试,意味着该片元始终通过深度测试...FrameBuffer(帧缓冲) 帧缓冲器(frame buffer):在显卡中硬件实现,用于存放渲染的最终结果。...一旦在后备缓冲器中完成绘制, 通过交换指令(D3为Present、OpenGL为SwapBuffer)就可将后备缓冲器中的内容与已经在屏幕上显示过的前台缓冲器(frontbuffer)中的内容进行交换,
不知大家是否有过类似的经历,比如说for循环渲染数组或者对象中的数据,渲染完成后,给数组或者对象添加、修改、删除数据后却没有在页面中渲染出来。...本篇就是来解释说明修改数组和对象数据视图立马更新的问题,要掌握各种情况和set、delete方法的使用 数组中数据渲染后的修改、新增、删除问题 list渲染中的问题...综上所述,数组要能直接触发视图更新在页面上渲染出来的方法 1.利用数组的api方法 2.改变数组指向的内存地址(改引用) 3.利用Vue的set、delete方法操作数组(推荐) 对象中数据渲染后的修改...$delete(vm.userInfo, "age") 经过我的测试这都是可以的,根据需要使用 综上所述 虽然修改数组、对象中的数据都可以直接改变引用地址实现,但是不推荐。
在OpenGL体系之中,纹理坐标又称UV坐标,通过两个浮点数组合来设置一个点的纹理坐标(U,V),其中U表示横轴,V表示纵轴。...渲染纹理的过程主要由三大项操作组成,分别说明如下: 一、启用纹理的一系列开关设置,该系列又包括下述步骤: 1、渲染纹理肯定要启用纹理功能了,并且为了能够正确渲染,还需同时启用深度测试。...启用深度测试的目的,是只绘制物体朝向观测者的正面,而不绘制物体的背面。上一篇文章的立方体和球体因为没有开启深度测试,所以背面的线段也都画了出来。...启用纹理与深度测试的代码示例如下: // 启用某功能,对应的glDisable是关闭某功能。 // GL_DEPTH_TEST指的是深度测试。...中存放了创建的Texture ID gl.glGenTextures(1, textures, 0); //通知OpenGL库使用这个Texture gl.glBindTexture
二、渲染原理 渲染管道 在OpenGL中,所有东西都在一个3D的空间里,而我们的屏幕和窗口都是2D的,所以OpenGL需要将3D的坐标转换成2D的坐标,做这件事的是OpenGL中的渲染管道(graphics...显卡有数千个处理核心来快速处理渲染管道中的数据,而这些是在每个步骤中通过运行在GPU上的多个小程序来处理的,这些小的程序被称之为程序着色器(shader)。...同时,因为它们运行在GPU上,又给我们保留了珍贵的GPU时间,在平时的开发中,我们也要充分利用GPU渲染来提高软件性能。...着色器通常使用GLSL来写,全称是OpenGL Shading Language。 举个例子 下图展示了一个抽象的渲染管线中的步骤,其中蓝色部分是我们可以注入自己的着色器。 ?...在实际的OpenGL编程中,我们至少需要定义一个Vertex Shader和Fragment shader。
然而在实际开发测试环境中,我们一般都是在内网开发,所以说对于支付测试是一件比较麻烦的事情。...Ngrok ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放(百度百科)。...优点:使用方便,Docker容器化,配置简单,各平台支持,也可以自己搭建服务器 缺点:ngrok 是一个开源程序,官网服务在国外,国内访问国外速度慢。...客户端和服务端生成在/data/ngrok/bin目录下: bin/ngrokd 服务端 bin/ngrok linux客户端 bin...端口,这里我们使用Nginx服务做转发,通过端口映射的方式访问Docker容器(参考docker-compose.yml配置)。
退出程序时没有释放内存*/ free(p); return 0; } 预防:一旦使用动态内存分配,请仔细检查程序的退出分支是否已经释放该动态内存。 2....二、自动查错机制 尽管在开发过程中坚守原则和谨慎编程甚至严格测试,然而内存泄露的错误还是难以杜绝,如何让系统自动查出内存泄露的错误呢?...(代码已经过严格测试,但这不是盈利的商业代码,即没有版权。
因此,可以在应用程序中分别创建多个不同的上下文,在不同线程中使用不同的上下文,上下文之间共享纹理、缓冲区等资源。这样的方案,会比反复切换上下文,或者大量修改渲染状态,更加合理高效的。...深度附着输出绘制图像的深度数据,深度数据主要在3D渲染中使用,一般用于判断物体的远近来实现遮挡的效果。...统一变量的值,在同个OpenGL着色器程序中的顶点着色器和片段着色器中是一致的。...深度测试,主要是通过对像素的运算出来的深度,也就是像素离屏幕的距离进行对比,根据OpenGL设定好的深度测试程序,决定是否最终渲染到画布上。...模板测试和深度测试的执行原理一致,但是执行的顺序是在深度测试之前的,放在后面 主要是比深度测试更加难以理解一些,初学者可以暂时跳过这个部分。
屏幕坐标系在OpenGL和DirectX之间的差异: 三角形设置 光栅化的第一个流水线阶段。...逐片元操作 OpenGL里称为逐片元操作,DirectX中称为输出合并阶段。这个阶段有几个主要任务: 决定每个片元可见性,涉及:深度测试、模板测试等。...不管模板测试有没有通过,我们都可以根据模板测试和深度测试的结果来修改模板缓冲区,操作修改可由开发者指定。 深度测试 高度可配置。...如果深度测试没有通过,它没有权利更改深度缓冲区中的值;如果通过了,开发者可以指定是否用这个片元的深度值盖掉缓冲区中的深度值——通过开启/关闭深度写入来控制。 混合 高度可配置。...经过上述流程,颜色缓冲区中的颜色值被显示到屏幕上,但是为了防止正在进行光栅化的图元被显示在屏幕上,GPU采取了 双重缓冲(Double Buffering) 的策略,所以对场景的渲染是发生在幕后的,即:
使用 OpenGL 不需要具备多么高深的数学水平,只要能辅导初中学生的数学作业,就足够用了。 一、坐标系 在 OpenGL 的世界里,有各式各样的坐标系。...由于glut中的窗口管理函数是不依赖于运行环境的,因此OpenGL中的工具库可以在X-Window、Windows NT、OS/2等系统下运行,特别适合于开发不需要复杂界面的OpenGL示例程序。...注意:这里必须是4个参数 glEnable(GL_DEPTH_TEST) # 开启深度测试,实现遮挡关系 glDepthFunc(GL_LEQUAL) # 设置深度测试函数...VBO 将顶点信息放到 GPU 中,GPU 在渲染时去缓存中取数据,二者中间的桥梁是 GL-Context。...这也是为什么要在渲染过程中,在每份绘制代码之中会有 glBindbuffer、glEnableVertexAttribArray、glVertexAttribPointer。
由于glut中的窗口管理函数是不依赖于运行环境的,因此OpenGL中的工具库可以在X-Window, Windows NT, OS/2等系统下运行,特别适合于开发不需要复杂界面的OpenGL示例程序。...这部分函数主要用于连接OpenGL和Windows ,以弥补OpenGL在文本方面的不足。 Windows专用库只能用于Windows环境中。...注意:这里必须是4个参数 glEnable(GL_DEPTH_TEST) # 开启深度测试,实现遮挡关系 glDepthFunc(GL_LEQUAL) # 设置深度测试函数...VBO 将顶点信息放到 GPU 中,GPU 在渲染时去缓存中取数据,二者中间的桥梁是 GL-Context。...这也是为什么要在渲染过程中,在每份绘制代码之中会有 glBindbuffer、glEnableVertexAttribArray、glVertexAttribPointer。
而如果在单元测试中,无法排除这些第三方依赖带来的干扰,则意味着本身你的单元测试也是不可预测的。因为第三方依赖可能正确,可能失败,你没法正确的去断言。...,测试邮件发送验证码,与其去真正发送一个邮件,不如mock一个邮件网关`,这样在单元测试中,我就可以方便的Mock它正确与错误的情况下,我的代码的执行是否符合预期。...我的myddd(基于整洁构架与领域驱动而构建的基础类库)及任何一个使用JPA的项目,在涉及数据库单元测试中,一律使用H2,它简单,方便,无须你关注,也不需要费劲去Mock。...就是在内部环境中,搭建相应用支持环境,专门提供给单元测试使用。...我在自己的项目中,对于Redis以及Mongo也都是采取这种方式,因为都在内部环境中,网络也非常快,无论是开发人员,还是CI/CD去执行单元测试,都可以使用这些服务。
TTP协议的接口测试中,使用到最多的就是GET请求与POST请求,其中POST请求有FORM参数提交请求与RAW请求,下面我将结合HttpClient来实现一下这三种形式: 一.GET请求: GET请求时
,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。...与任何OpenGL ES实现一样,您还可以使用帧缓冲器进行离屏图形处理或渲染纹理,以用于图形管道中的其他位置。借助OpenGL ES 3.0,可以在使用多个渲染目标的渲染算法中使用离屏缓冲区。...与iOS集成 iOS应用程序默认支持多任务处理,但在OpenGL ES应用程序中正确处理此功能需要额外考虑。不正确地使用OpenGL ES会导致您的应用在后台被系统杀死。...如果设备不支持请求的OpenGL ES版本,则initWithAPI:方法返回nil。在使用它之前,您的应用必须进行测试以确保上下文已成功初始化。...您的应用程序应该测试上下文的API属性并使用它来选择正确的呈现路径。 实现此行为的常见模式是为每个呈现路径创建一个类。 您的应用程序在初始化时测试上下文并创建一次渲染器。
领取专属 10元无门槛券
手把手带您无忧上云