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

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

在 OpenGL 世界里,使用深度测试可以来防止被阻挡的面渲染到其他面的前面。 直接看一个没有使用深度测试的绘制: ?...屏幕空间坐标与通过 OpenGL 的 glViewport 所定义的口密切相关,并且可以通过 GLSL 的内建变量 gl_FragCoord 从片段着色器中直接访问。...在片段深度值等于缓冲的深度值时通过测试 GL_LEQUAL 在片段深度值小于等于缓冲的深度值时通过测试 GL_GREATER 在片段深度值大于缓冲的深度值时通过测试 GL_NOTEQUAL 在片段深度值不等于缓冲的深度值时通过测试...GL_GEQUAL 在片段深度值大于等于缓冲的深度值时通过测试 默认情况下使用的是 GL_LESS,它将丢弃深度值大于当前深度缓冲值的所有片段。...可以看到在 z 值位于 1.0 和 2.0 之间时,对应的深度值为 0.0 到 0.5 的区间,这就占据了深度值区间范围的 50 %。而 2.0 之后的范围也才占据了 50 %。

1.6K30

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

与屏幕空间坐标相关的是由 OpenGL 的口设置函数 glViewport 函数给定,并且可以通过片段着色器中内置的 gl_FragCoord 变量访问。...gl_FragCoord 还包含一个 z 坐标,它包含了片段的实际深度值,此 z 坐标值是与深度缓冲的内容进行比较的值。...如果启用深度测试,那么需要在渲染之前使用 glClear(GL_DEPTH_BUFFER_BIT); 清除深度缓冲,否则深度缓冲将保留上一次进行深度测试时所写的深度值。...OpenGL 深度测试是通过深度测试函数 glDepthFunc 控制深度测试是否通过和如何更新深度缓冲。 深度测试函数接收的比较运算符: ?...防止深度冲突的方法: 不要让物体之间靠得过近,以免它们的三角形面片发生重叠; 把近平面设置得远一些(越靠近近平面的位置精度越高); 牺牲一些性能,使用更高精度的深度值。

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

iOS开发-OpenGLES进阶教程4

概要 帧缓存:接收渲染结果的缓冲叫做帧缓存。 在OpenGL的渲染管道中,几何数据和纹理通过一系列变换和测试后,变成渲染到屏幕上的二维像素。渲染的目标管道就是帧缓存。...CoreAnimation合成器使用OpenGL ES来尽可能高效地控制GPU、混合和切换帧缓存。 思考:OpenGL ES的渲染结果会放到帧缓存如何与视图的显示联系起来? 效果展示 ?...核心思路 如下图,帧缓存像素颜色的输出结果在GL_COLOR_ATTATCHMENT开头的缓存。...在渲染纹理Texture0的时候使用不同的口大小,但是没有调用glviewport()。...思考 答案:CAEGLayer OpenGL ES会有连接到,与分享数据的帧缓存,至少包括一个像素颜色渲染缓存。

84040

OPengl、DirectX、OPenCV、OpenCL

OPenGL作为行业标准的接口,从Windows退出ARB后,window默认的版本始终都是OpenGl 1.1,可以通过工具查询显卡支持的OpenGL版本,同时通过驱动升级提高Windows OpengGL..._Constants.html 基本设备: 1.帧缓冲(glutInitDisplayMode(多种模式混合设置)):   a.深度缓冲(z值越大离相机越远,又称Z缓冲GL_DEPTH_BITS...) glGenBuffers创建缓冲,glBindBuffer绑定缓冲,glBufferData填充缓冲 glEnable(GL_DEPTH_TEST)启动深度测试(遮挡关系);glEnable...服务端,glEnable   b.颜色缓冲GL_RED_BITS, GL_GREEN_BITS, GL_BLUE_BITS, GL_ALPHA_BITS,GL_INDEX_BITS)   c.模板缓冲...内置变量:gl_Color顶点着色器或片段着色器的主颜色 3.坐标系:   世界坐标(WC 屏幕原点)、物体坐标(MC 模型移动时坐标系不变,只是移动模型)、设备坐标(口DC)、眼坐标(z

2.1K50

视频直播与虚拟现实的渲染 - OpenGL ES

6、绘图(Draw),绘制部分或者整个场景。 7、删除(Delete),删除生产的缓存并且释放资源。 缓存的生成、初始化和删除,需要耗费时间来同步图形处理器和CPU。...帧缓存 接收渲染结果的缓冲叫做帧缓存。 有两个特别的帧缓存,前帧缓存和后帧缓存,控制着屏幕像素的最终颜色。...context presentRenderbuffer:GL_RENDERBUFFER 让上下文调整外观并使用CoreAnimation合成器把帧缓存的像素颜色渲染缓存与其他相关混合起来。...(设置口变换的口大小) 视图重新调整大小的时候,layoutSubviews会被调用。 CADisplayLink的消息为重新渲染一个场景提供了理想的触发器,渲染速度大于显示刷新速度是浪费。...口坐标 帧缓存中的像素位置叫做口坐标。口转换的结果是所有绘制的几何图形都被拉伸以适应屏幕大小。

1.6K80

OpenGL ES 3.0 | 围绕HelloTriangle实战案例 展开 渲染流程分析

) 加载顶点、片段着色器 创建一个程序对象, 连接顶点、片段着色器, 并链接程序对象; 设置口; 清除颜色缓冲; 渲染简单图元 使颜色缓冲的内容在EGL窗口表面(GLSurfaceView)中可见...宽度和高度; 在OpenGL ES 中, 口(Viewport) 定义所有 OpenGL ES 渲染操作 最终显示的 2D矩形; 口 由 原点坐标(x,y)和宽度、高度 定义; 清除颜色缓冲...设置口之后,需要清除屏幕; 在OpenGL ES中, 绘图中涉及多种缓冲类型:颜色、深度、模板; HelloTriangle案例中, 只向颜色缓冲中绘制图形; 在每个帧的开始, 用GLES30...GLES30.glClear()之前设置; 加载几何形状和绘制图元 加载几何形状 清除颜色缓冲、设置口和加载程序对象之后, 指定三角形的几何形状; 三角形的顶点由mVerticesData数组中的...如何在屏幕上 真正显示帧缓冲的内容 ——双缓冲 ?

1.4K10

像素的一生

写这篇文章是想追忆像素的由来,我们且从chrome入手,窥探其内核是如何将web内容转换为像素。...请注意 DOM 结构和 ComputedStyle 值(如“float: left”)如何作为布局算法的输入。...命令缓冲command buffer最初是为序列化的GL图形命令构建的,类似一个proxy。...当前的“进程外”栅格化(即GPU)以不同的方式使用它们,更多是绘制操作的包装器,就是命令缓冲command buffer与底层图形API无关 [image.png] GPU进程中的GL函数指针通过动态查找操作系统底层共享的...tiling: 栅格化整个图层成本大,渲染进程合成线程将layer分块后选择口相近的图块tiles再进行栅格化成本小很多 activate: 合成线程具有两个树的副本,pending tree负责将新

1.4K20

实验5 OpenGL模型视图变换

(投影变换) 4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部(指定在显示器窗口的那个位置显示)。(口变换) 这些,都可以在OpenGL中实现。...设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样: glMatrixMode(GL_MODELVIEW); 该语句指定一个4×4的建模矩阵作为当前矩阵。...在代码中,视图变换必须出现在模型变换之前,但可以在绘图之前的任何时候执行投影变换和口变换。...由于投影变换,口变换共同决定了场景是如何映射到计算机的屏幕上的,而且它们都与屏幕的宽度,高度密切相关,因此应该放在reshape()中。reshape()会在窗口初次创建,移动或改变时被调用。...除了考虑视野之外,投影变换确定物体如何投影到屏幕上,OpenGL提供了两种基本类型的投影,1、透视投影:远大近小;2、正投影:不影响相对大小,一般用于建筑和CAD应用程序中 (4)口变换 口变换指定一个图象在屏幕上所占的区域

1.6K30

OpenGL: 如何利用 Shader 实现 RGBA 到 NV21 图像格式转换?(全网首次开源)

最重要的一点是口要设置正确:glViewport(0, 0, width / 4, height * 1.5); 。...由于口宽度设置为原来的 1/4 ,可以简单的认为(实际上比较复杂)相对于原来的图像每隔 4 个像素做一次采样,由于我们生成 Y plane 的图像需要对每一个像素都进行采样,所以还需要进行 3 次偏移采样...plane 缓冲的高度为 height/2 ,VU plane 在垂直方向的采样是隔行进行,整个范围采样结束时填充好 width*height/2 大小的缓冲。..., //一次采样(加三次偏移采样)4 个 RGBA 像素(R,G,B,A)生成 1 个(Y0,Y1,Y2,Y3),整个范围采样结束时填充好 width*height 大小的缓冲;...height/2 ,VU plane 在垂直方向的采样是隔行进行,整个范围采样结束时填充好 width*height/2 大小的缓冲

2.1K51

WebGL简易教程(十三):帧缓存对象(离屏渲染)

创建纹理对象并设置其尺寸和参数 在教程《WebGL简易教程(十一):纹理》中就已经介绍过如何创建纹理对象并设置纹理对象的参数。...(gl.FRAMEBUFFER, null); //将绘制目标切换为颜色缓冲 gl.viewport(0, 0, canvas.width, canvas.height); // 设置口为当前画布的大小...绘制到帧缓存 为了声明当前是绘制到帧缓存的,首先将要绑定帧缓冲对象gl.bindFramebuffer()。然后调用gl.viewport()函数定义一个绘图的口: ?.../将绘制目标切换为帧缓冲对象FBO gl.viewport(0, 0, OFFSCREEN_WIDTH, OFFSCREEN_HEIGHT); // 为FBO设置一个gl.clearColor..., canvas.height); // 设置口为当前画布的大小 gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.clear(gl.COLOR_BUFFER_BIT

2.6K20

OpenGL ES正交投影实现方法(三)

); GLES20.glEnable(GLES20.GL_DEPTH_TEST); } @Override public void onSurfaceChanged(GL10 gl,...gl) { GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); rectangle.draw...正交投影是一种平行投影,投影线是平行的,其视景体是一个长方体,坐标位于视景体中的物体才有效,视景体里面的物体投影到近平面上的部分最终会显示到屏幕的口中,关于口后面会降到。...口 前面说过在视景体中的物体最终会投影到近平面上,最终显示到口上,正如前面在onSurfaceChanged设置的那样。...口用的屏幕坐标系原点并不在屏幕左上角而是在左下角,x轴向右,y轴向上。其实还不是很准确,准确的说,口的坐标原点位于该View的左下角,因为GLSurfaceView并不总是占据整个屏幕的。

87920

实验6 OpenGL模型视图变换

(4)口变换:将投影变换得到的投影图映射到屏幕的上,确定最终图像在屏幕上所占的区域。 上述变换在OpenGL中实际上是通过矩阵乘法来实现。...(5)在调用glFrustum设置投影变换之前,在reshape函数中有一些准备工作:口变换 + 投影变换 + 模型视图变换。...由于投影变换,口变换共同决定了场景是如何映射到计算机的屏幕上的,而且它们都与屏幕的宽度、高度密切相关,因此应该放在reshape函数中。..., GL_LINE);//线框模式 else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);//填充模式 glEnable(GL_DEPTH_TEST);...Draw_Scene(); if (bAnim) fRotate += 0.5f;//旋转 if (tAnim) tRotate += 0.5f; glutSwapBuffers();//交换缓冲

2K30

【OpenGL】九、OpenGL 绘制基础 ( OpenGL 状态机概念 | OpenGL 矩阵概念 )

: // 设置清除缓冲背景颜色 // glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)...初始化矩阵 : // 矩阵环境初始化 , 主要是投影矩阵和模型矩阵 // ( 选中投影矩阵 ) 设置矩阵模式 , 告知 GPU 当前要操作的矩阵是投影矩阵 glMatrixMode(GL_PROJECTION...向投影矩阵设置参数 gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f); // ( 选中模型矩阵 ) glMatrixMode(GL_MODELVIEW...; 稍后会使用 OpenGL 在桌面窗口中绘制一个点 , 绘制前将当前颜色设置为白色 , 然后绘制的点的颜色就是白色 ; 如果想要绘制不同颜色的点 , 就需要在每次绘制前 , 都修改当前颜色值 ; 整个...( ModelView ) 矩阵 的作用就是将上述 世界坐标系中的三维坐标点 , 放到 口中 , 口坐标系是摄像机下的可见范围 ; 摄像机位置 : 右手坐标系 : x 指向屏幕右侧 , y 指向屏幕上方

4K00
领券