首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NDK OpenGLES3.0 开发(十一):模板测试

OpenGL ES 模板测试 模板测试与深度测试类似,主要作用是利用模板缓冲区(Stencil Buffer)所保存的模板值决定当前片段是否被丢弃,且发生于深度测试之前。 ?...,但是深度测试失败时将如何更新模板值; dppass:如果深度测试和模板测试都通过,将如何更新模板值。...一样将模板值 -1 ,如果模板值已经是最小值则设为最大值 GL_INVERT 按位反转当前模板缓冲区的值 绘制物体轮廓是模板测试的常见应用,其步骤一般如下: 启动深度测试和模板测试,清空模板缓冲和深度缓冲...; 在绘制物体前,用 1 更新物体将被渲染的片段对应的模板值; 渲染物体,写入模板缓冲区; 关闭模板写入和深度测试; 将物体放大一定比例; 使用一个不同的片段着色器用来输出一个纯颜色(物体轮廓颜色);...再次绘制物体,当片段的模板值不为 1 时,片段通过测试进行渲染; 开启模板写入和深度测试。

79810

NDK OpenGLES3.0 开发(十):深度测试

深度缓冲区通常和颜色缓冲区有着相同的宽度和高度,一般由窗口系统自动创建并将其深度值存储为 16、 24 或 32 位浮点数。 当深度测试开启的时候, OpenGL 才会测试深度缓冲区中的深度值。...如果此测试通过,深度缓冲内的值可以被设为新的深度值;如果深度测试失败,则丢弃该片段。 深度测试是在片段着色器运行之后(并且在模板测试运行之后)在屏幕空间中执行的。...不启用深度测试 开启深度测试后,如果片段通过深度测试,OpenGL 自动在深度缓冲区存储片段的 gl_FragCoord.z 值,如果深度测试失败,那么相应地丢弃该片段。...OpenGL 深度测试是通过深度测试函数 glDepthFunc 控制深度测试是否通过和如何更新深度缓冲区。 深度测试函数接收的比较运算符: ?...深度测试函数接收的比较运算符 深度测试启用后,默认情况下深度测试函数使用 GL_LESS,这将丢弃深度值高于或等于当前深度缓冲区的值的片段。 深度测试中,深度冲突现象需要值得注意。

1K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    《Unity Shader入门精要》笔记(一)

    这个阶段有几个主要任务: 决定每个片元可见性,涉及:深度测试、模板测试等。 通过测试后的片元与颜色缓冲区的颜色进行合并/混合。 深度测试、模板测试的简化流程图: 模板测试 高度可配置。...不管模板测试有没有通过,我们都可以根据模板测试和深度测试的结果来修改模板缓冲区,操作修改可由开发者指定。 深度测试 高度可配置。...与模板测试类似,将当前片元的深度值和深度缓冲区的深度值进行比较,比较函数可由开发者设置,通常这个比较函数是小于等于的关系,也就是显示距离相机更近的物体。...如果深度测试没有通过,它没有权利更改深度缓冲区中的值;如果通过了,开发者可以指定是否用这个片元的深度值盖掉缓冲区中的深度值——通过开启/关闭深度写入来控制。 混合 高度可配置。...开发者可选择开启/关闭混合模式,来控制是直接覆盖,还是将源颜色(当前片元的颜色)和目标颜色(颜色缓冲区的颜色)进行混合后写入颜色缓冲区。

    1.1K11

    OpenGL ES 3.0 简介

    光栅化阶段 生成的 颜色、深度、模板 和 屏幕坐标位置(Xw,Yw) 变成 OpenGL ES 3.0管线 逐片段操作 阶段的输入。...剪裁测试—— 确定(Xw,Yw)是否位于OpenGL ES 状态的一部分的裁剪矩形范围内,抛弃范围之外的片段。...模板测试、深度测试—— 这些测试在输入片段的 模板 和 深度值 上进行 ,以确定片段是都该被拒绝。 混合——将新生成的颜色和保存在帧缓冲区(Xw,Yw)位置的颜色值组合起来。...抖动——用于最小化 因为使用有限精度在帧缓冲区中保存颜色值而产生的伪像。 在逐片段操作阶段的最后,片段 被拒绝 或者 在帧缓冲区(Xw,Yw)位置写入片段的颜色、深度或者模板值。...写入片段的颜色、深度或者模板值 取决于 启用的相应写入掩码。写入掩码可以更精细的控制写入的值。例如,可以设置颜色缓冲区的写入掩码 使得 任何红色值都不被写入到颜色缓冲区。

    1.4K20

    三维图形渲染显示的全过程

    输入一般是一个变换矩阵和一个相对坐标;输出为眼空间中的坐标及每个顶点所附带的其他属性,如颜色、纹理坐标 曲面细分着色器:用于细分图元,分为3个阶段。...如果一个片元通过了所有的测试,新生成的片元才能和颜色缓冲区中已存在的像素颜色进行Alpha混合,并写入颜色缓冲区 • Alpha测试: ?...注1:若建立模板缓冲区为8bits,则模板值的范围为:[0, 255]的整数;其初始值为清理模板缓冲区的所设置的值 注2:若在模板测试时,关闭了深度测试,则深度测试始终通过 • 深度测试: ?...注1:深度值范围(D3D:[0.0, 1.0] OpenGL:[-1.0, 1.0]),建立深度缓冲区位数越多,则深度值的精度就会越高;其初始值为清理深度缓冲区的所设置的值 注2:关闭了深度测试,意味着该片元始终通过深度测试...由于只是将前台缓冲区的指针和后备缓冲区的指针做一个简单的交换,提交是一个运行速度很快的操作。

    4.1K41

    20分钟让你了解OpenGL ——OpenGL全流程详细解读

    通过了深度测试和模板测试,会和帧缓冲区上的颜色附着(FrameBuffer上的ColorAttachment)上的颜色进行混合,决定最终留在画布上的颜色是什么。 ? ?...测试主要可以分为像素所有者测试(PixelOwnershipTest)、裁剪测试(ScissorTest)、模板测试(StencilTest)和深度测试(DepthTest),执行的顺序也是按照这个顺序进行执行...深度测试,主要是通过对像素的运算出来的深度,也就是像素离屏幕的距离进行对比,根据OpenGL设定好的深度测试程序,决定是否最终渲染到画布上。...模板测试和深度测试的执行原理一致,但是执行的顺序是在深度测试之前的,放在后面 主要是比深度测试更加难以理解一些,初学者可以暂时跳过这个部分。...模板测试同样也是通过模板测试程序去决定最终的像素是否丢弃,同样也是根据OpenGL的模板覆写状态决定是否更新像素的模板值。

    8.1K44

    OpenGLES_理论01_介绍

    用于指定物体和操作, 创建交互式的三维应用程序 问题3: OpenGL 提供的函数能完成那些任务和不能完成那些任务 OpenGL 只提供了一些简单的图元描述如(点,直线和多变形),没有提供描述三维物体模型的高级函数...,如(汽车,身体的某些关节等) 理解OpenGL 渲染原理 操作顺序 [名词解释] 顶点数据对象 比如你要绘制一个三角形,三角形有三个顶点,你要把三个顶点的数据,放到内存中的一个区域中,这个内存对象...),每个片段都具有各自的颜色和深度值 纹理内存 存放纹理图片的内存区域 片段着色器 对最终像素点,显示颜色做一些,运算或者处理操作,比如你想让显示的图片变的模糊,你就在这里干....片段操作 我们在片段着色器上纹理图片或者颜色数据进行了处理操作,但是还没有显示到片段上,前面的一些操作,生成了最终的颜色和深度,如果有效,执行可用的裁剪测试,alpha测试,模板测试和深度缓冲测试,某种测试失败将放弃最终片段方块的继续处理...如果成功,执行的是混合,抖动,逻辑操作以及根据一个位掩码屏蔽操作,完成处理的片段就会被绘制到适当的缓冲区上。

    62710

    OpenGL ES 3.0 深度测试(OC)(二)

    这几个步骤同文章一,下面主要讲解下申请缓存区(深度测试),和渲染的步骤。 1.申请缓存区(深度测试) 一般情况下我们要申请渲染缓存区,帧缓存区,如果使用深度测试也需要申请深度缓存区。...,还需要绑定下 // 在帧缓存 和 渲染缓存创建 和 绑定结束后需要 // 渲染缓存作为帧缓存的某种(颜色、深度、模板)附件 glFramebufferRenderbuffer(...3.什么是深度测试 深度测试的概念: 深度其实就是该像素点在3D世界中距离摄像机的距离Z值 什么是深度缓冲区? 深度缓存区,就是一块内存区域,专门储存着每个像素点(绘制在屏幕上的)深度值。...有了深度缓冲区后,绘制 物体的顺序就不那么重要的。实际上,只要存在深度缓冲区,OpenGL都会把像素的深度值写入到缓冲区中。除非调用glDepthMask(GL_FALSE)来禁止写入。...如果启用了深度缓冲区,在绘制每个像素之前,OpenGL会把它的深度值和已经存储在这个像素的深度值进行比较。

    97710

    【前端er入门Shader系列】01—从渲染管线了解Shader

    测试与混合:虽然片元着色器输出了颜色缓冲,但现实 3D 场景还需要考虑远近遮挡、半透明物体透视等因素,所以必须经过模板、深度和混合测试后才能最终输出颜色缓冲。...(1) 模板测试(Stencil Test) 通过每个像素/片段的8位模板掩码值确定片段的丢弃或保留,用于裁剪出特定的形状; (2) 深度测试(Depth test) 在颜色被写入帧缓冲区之前会进行深度测试...开启后会在深度缓冲中存储每个片段的z深度值(16/24/32位float,一般默认精度为24),用当前渲染的每个片段的深度值与深度缓冲值对比测试,若测试通过则更新深度缓冲中的深度值,若测试失败则丢弃片段...深度测试是在屏幕空间中运行的,深度值在 0.0 ~ 1.0 之间(0近处/1远处),实体对象一般都会开启深度测试和深度写入,但像技能特效中的半透明效果,只进行深度测试不进行深度写入。...总结如下: 非透明物体的深度写入开启,深度测试开启,绘制顺序可以与远近无关。 半透明物体的深度写入关闭,深度测试开启,需要按从远及近的顺序进行绘制。

    29211

    OpenGL ES简介

    光栅化阶段产生的颜色、深度、模板和屏幕坐标(Xw, Yw)成为流水线中pre-fragment阶段(FragmentShader之后)的输入。...Stencil and depth tests:模板和深度测试传入片元的模板和深度值,决定是否丢弃片元。...逐片元操作之后,片元要么被丢弃,要么一个片元的颜色,深度或者模板值被写入到framebuffer的(Xw,Yw)位置,不过是否真的会写入还得依赖于write masks启用与否。...write masks能更好的控制颜色、深度和模板值写入到合适的缓冲区。例如:颜色缓冲区中的write mask可以被设置成没有红色值写入到颜色缓冲区。...另外,Opengl ES 2.0提framebuffer中获取像素的接口,不过需要记住的是像素只能从颜色缓冲区读回,深度和模板值不能读回。

    2K70

    【专业技术】OpenGL操作技巧介绍

    在最终的像素数据写入到帧缓冲区之前,这两种类型的数据都将经过相同的最终步骤(光棚化和基于 片断的操作)。下面,我们更为详细地介绍OpenGL渲染管线的一些关键阶段。...接下来所进行的是视口(viewport)和深度(z 坐标)操作。如果启用了剔除功能(culling)并且该图元是个多边形,那么它就有可能被剔除测试所拒绝。...处理结果先进行截取,然后或者写入到纹理内存,或者发送到光棚化阶段。如果像素数据时从帧缓冲区读取的,就对他们执行像素转换操作(缩放、偏移、映射和截取)。...这样,在数据写入到纹理内存或者写回到帧缓冲区之前,只需要进行一道像素转换就可以了。...接着可能进行的是雾计算,然后是剪裁测试,alpha测试,模板测试和深度缓冲区 测试(深度缓冲区用于消除被隐藏的表面)。如果一个片断无法通过一个启用的测试,它的连续处理过程可能会被中断。

    1.4K20

    OpenGL ES简介

    光栅化阶段产生的颜色、深度、模板和屏幕坐标(Xw, Yw)成为流水线中pre-fragment阶段(FragmentShader之后)的输入。...Stencil and depth tests:模板和深度测试传入片元的模板和深度值,决定是否丢弃片元。...逐片元操作之后,片元要么被丢弃,要么一个片元的颜色,深度或者模板值被写入到framebuffer的(Xw,Yw)位置,不过是否真的会写入还得依赖于write masks启用与否。...write masks能更好的控制颜色、深度和模板值写入到合适的缓冲区。例如:颜色缓冲区中的write mask可以被设置成没有红色值写入到颜色缓冲区。...另外,Opengl ES 2.0提framebuffer中获取像素的接口,不过需要记住的是像素只能从颜色缓冲区读回,深度和模板值不能读回。

    1.9K50

    模板阴影理论概述

    箭头末尾的数字是渲染阴影卷后留在模版缓冲区中的值。具有非零模板值的片段被认为是阴影。在模板缓冲区中生成值是以下模板操作的结果: 渲染阴影卷的正面。如果深度测试通过,增加模板值,否则不执行任何操作。...禁止绘制到帧和深度缓冲区。 渲染阴影卷的背面。如果深度测试通过,减少模板值,否则不执行任何操作。禁止绘制到帧和深度缓冲区。...当我们渲染阴影卷的正面时,深度测试将通过,模板值将增加到1.当我们渲染阴影卷的背面时,深度测试将失败,因为阴影卷的背面位于封堵器后面。...如果深度测试失败,则增加模板值,否则不执行任何操作。禁止绘制到帧和深度缓冲区。 渲染阴影卷的正面。如果深度测试失败,减少模板值,否则不执行任何操作。禁止绘制到帧和深度缓冲区。...实施模板阴影卷的步骤的一般列表将是: 使用环境照明和任何其他表面阴影属性渲染所有对象。渲染不应该依赖于任何特定的光源。确保深度缓冲区被写入。

    1.1K30

    14.opengl高级-模板测试

    1.3 stencil test在graphics pipeline里面的位置,模板测试在深度测试之前 ?...); // 每一位写入模板缓冲时都保持原样 glStencilMask(0x00); // 每一位在写入模板缓冲时都会变成0(禁用写入) // 测试规则 glStencilFunc(GL_EQUAL,...1, 0xFF) GL_ALWAYS //永远通过深度测试 GL_NEVER //永远不通过深度测试 GL_LESS //在片段深度值小于缓冲的深度值时通过测试 GL_EQUAL //...在片段深度值等于缓冲区的深度值时通过测试 GL_LEQUAL //在片段深度值小于等于缓冲区的深度值时通过测试 GL_GREATER //在片段深度值大于缓冲区的深度值时通过测试 GL_NOTEQUAL...//在片段深度值不等于缓冲区的深度值时通过测试 GL_GEQUAL 在片段深度值大于等于缓冲区的深度值时通过测试 // 测试完,有三种结果,每一种测试结果可以设置是否通过(决定要不要绘制) glStencilOp

    1.1K30

    OpenGL 深度测试与精度值的那些事

    这就是在没有开启深度测试的情况下,本来应该被遮挡的,绘制在后面的面却绘制到了其他面之上。 要解决这种问题,就得使用深度测试了。...OpenGL 会执行一个深度测试,如果这个测试通过了的话,深度缓冲将会更新为新的深度值,如果深度测试失败了,该片段将会被丢弃。 深度缓冲是在片段着色器运行之后,在屏幕空间中运行的。...OpenGL 运行我们禁用深度缓冲的写入,只需要设置它的深度掩码为 GL_FALSE 即可。...在片段深度值等于缓冲区的深度值时通过测试 GL_LEQUAL 在片段深度值小于等于缓冲区的深度值时通过测试 GL_GREATER 在片段深度值大于缓冲区的深度值时通过测试 GL_NOTEQUAL 在片段深度值不等于缓冲区的深度值时通过测试...GL_GEQUAL 在片段深度值大于等于缓冲区的深度值时通过测试 默认情况下使用的是 GL_LESS,它将丢弃深度值大于当前深度缓冲值的所有片段。

    1.8K30

    一看就懂的 OpenGL 基础概念(4):各种 O 之 FBO丨音视频基础

    一般来讲,必要的是颜色缓冲区和深度缓冲区,模板缓冲区、累加缓冲区是可选的。...FBO 虽然也叫缓冲区对象,但是它并不是一个真正的缓冲区,因为 OpenGL 并没有为它分配存储空间去存储渲染所需的几何、像素数据,我们可以认为它是一个指针的集合,这些指针指向了颜色缓冲区、深度缓冲区、...模板缓冲区、累积缓冲区等这些真正的缓冲区对象,我们把这里的『指向关系』叫做附着,而 FBO 中的附着点类型有:颜色附着、深度附着和模板附着。...渲染缓冲区对象(Render Buffer Object,RBO)则是一个由应用程序分配的 2D 图像缓冲区,可以分配和存储颜色、深度或者模板值,可以用作 FBO 中的颜色、深度或者模板附着。...1)使用纹理附件 当把一个纹理(Texture)附加到 FBO 上的时候,所有渲染命令会写入到纹理上,就像它是一个普通的颜色/深度或者模板缓冲一样。

    2.1K30

    (实时)渲染管线(pipeline)

    屏幕映射得到的屏幕坐标决定了这个顶点对应屏幕上的哪个像素以及距离这个像素有多远(z轴)。 屏幕坐标在OpenGL和DirectX之间有一定差异。...模板测试和深度测试是比较复杂的过程,不同的图形API的实现细节也不同,下面是最基础的测试---模板测试和深度测试的实现过程。...模板测试(Stencil Test),与其对应的是模板缓冲(Stencil Buffer),如果开启的模板测试,则模板测试一般用来限制渲染区域。...如果一个片元通过了模板测试,那么它会继续进行深度测试(Depth Test)注意,只有通过了深度测试,并且开启了深度写入才可以修改深度缓冲区。深度测试与透明效果密切相关。...Draw CallDraw Call本身的含义很简单,就是CPU调用图像编程接口如OpenGL的glDrawElements,以命令GPU进行渲染的操作如果没有流水线化,那么CPU需要等GPU完成上一个渲染命令后

    24920

    OpenGL与OpenGL在移动端的应用

    renderbuffer可以用来分配和存储颜色、深度或模板值,也可以用作framebuffer对象中的颜色、深度或模板附件。渲染缓冲区类似于屏幕外窗口系统提供的可绘制表面,例如pbuffer。...frameBuffer:framebuffer对象(通常称为FBO)是颜色、深度和模板缓冲区连接点的集合;描述附加到FBO的颜色、深度和模板缓冲区的大小和格式等属性的状态;以及附加到FBO的纹理和renderbuffer...,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT 也可组合如:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT...6).Per-Fragment Operations (逐片段操作) 它包含像素归属测试(Pixel Ownership Test)、裁剪测试(Scissor Test)、模板和深度测试(Stencil...setupCubeProjectionAndCamara]; [self drawOutLine]; //画轮廓 [self drawTopPoi]; //画顶层poi 里面有多次深度测试的开启和关闭

    2.7K30

    OpenGL学习笔记 (一)- 综述、渲染管线

    因此,OpenGL绘制操作的结果,是向内存/显存中的一段连续空间(也就是帧缓存,Frame buffer)写入若干像素信息,作为屏幕的显示内容。而OpenGL接受的,通常是若干三维空间内的数据。...通过图元装配,顶点数据将会被转化为完整的几何图元,也就是根据颜色、深度等等进行了变化和裁剪的顶点。由于早期图元装配已经做了装配图元的工作(没错,装配图元不是这个时候进行的!)...可能的测试有剪裁测试、alpha测试、模板测试和深度缓冲区测试等等。如果失败(比如发现片段被另一个片段遮挡)将会抛弃这个片段。 之后将会进行混合、抖动、逻辑操作、写掩码等等复杂的处理。...不过通常情况下,程序采用双缓冲(double buffer)的形式。因为如果仅采用一个缓冲,那渲染新一帧的过程中写入和新数据与旧数据混杂,会导致画面撕裂。因此通常程序会设置两个缓冲区。...矩阵后使用“行x列”的形式表示大小(如mat2x4),对于方阵可以直接使用一位数字(如mat4)。向量和矩阵的维度最多支持4维。

    1.7K11
    领券