当前位置: 首页 > 知识库问答 >
问题:

理解OpenGL中的一些术语?

武琛
2023-03-14

我很难理解官方文档(https://www.khronos.org/opengl/wiki/rendering_pipeline_overview)中使用的术语

>

  • 它说准备顶点数组数据可以类似于给定一个3D位置数据和UV纹理坐标列表,以及一个索引列表,它可以生成一个顶点流。

    然后需要对这些顶点流进行解释,以便OpenGL可以对其进行操作。例如,12个顶点的流可以被解释为4个单独的三角形或10个依赖的三角形。

    但在我看来,上面的步骤似乎是将许多步骤结合在一起,即顶点着色和基元组装。这许多步骤真的全部发生了吗?

    例如,文档在顶点着色中说,流中的顶点被转换为输出顶点。这是如此笼统,看起来像是在准备顶点数组数据的“第一”步骤中已经做过的事情。

    下面是我对整个管道的最基本的想法:

    > 3d位置形式的

  • 顶点数据作为列表输入(流)馈送,另外还可以输入纹理坐标列表。

    该数据流被消耗,并且与索引列表一起,我们按顺序排列顶点。然后以特定的方式解释有序的顶点列表(例如,每3个顶点=1个原语或每连续的3个顶点=1个原语)。

    然后将顶点发送到顶点着色器,顶点着色器还输入顶点列表并计算顶点法线等属性,然后将它们作为顶点输出流发送。

    然后是可选的步骤,通过tessalization着色器计算额外的图元,或者使用作用于tessalized图元的几何图形着色器来创建甚至更复杂的图元。

    现在我们继续讨论基元组装,这是一个与计算基元的早期阶段不同的过程。这一步寻求将原语分解为许多基本原语。例如。构成一个基元的12个顶点的列表被分解为11个基本线基元。

    然后我们进入裁剪过程,在这里我们修改或删除所有不在相机视野内的顶点。

    下一步是光栅化,我们根据光栅化器消耗的基本原语流生成片段。这些片段比基本图元小得多,用来覆盖像素,而不是一个像素一个像素地输出(如光线跟踪)。这会产生源自基本原语的片段输出。

    我们将这个片段流发送到片段着色器,它在功能上与顶点着色器类似。它消耗这个片段的输入流并处理每个片段的颜色,查找纹理中的颜色(如果有的话)并修改像素深度值。

    接下来会发生什么?我读到了每样例处理,但它并不能解释很多。

    我在理解上的差距:

    >

  • 片段如何工作,最终“覆盖”屏幕中的像素?

    在第8步中,我们是真的计算像素深度值还是仅仅是计算片段深度值?

    每个片段的输出如何知道它(相对)应该覆盖哪些像素?

    在光栅化中,我假设生成的碎片是三角形。三角形是如何由基本图元构成的?

  • 共有1个答案

    郎增
    2023-03-14

    你的理解有些细微的不准确,这可能是你困惑的原因。让我试着纠正一下:

    在这一点上(顶点着色器之前),还没有基元。每个顶点都是自己处理的,与它们之后发生的事情无关。如果你有一个索引列表,这只会告诉GPU要处理什么顶点数据。但即便如此,还没有原语。这些将只由基元组装步骤生成。

    基元程序集从顶点流创建基元(取决于绘制调用参数和着色器配置)。基本上,它正在执行您在步骤2中描述的操作。图元只有三种类型(点、线、三角形)。一旦你有了一个例如三角形,它绝不会像你建议的那样分解成更小或更基本的三角形。因此,原始组装并没有太大的作用。它只是将正确的顶点数据组合成正确的原语(例如,三个后续顶点可能组成一个三角形)。

    碎片并不只是偶然地覆盖了像素。它们本质上是像素。更准确地说,它们表示由屏幕上的给定像素表示的原语部分。并为所有这些片段/像素调用片段着色器。在DirectX环境中,这个阶段称为像素着色器,它使连接更加明确。例如。一条10像素宽的水平线将被光栅化成10个片段。没有更多的三角形或其他基元超过这个阶段。

    现在回答你们的问题。相信上面已经回答了很多。

    1. 我相信这个已经有了答案。您可以查看一些光栅化算法以了解其实现。其基本思想是收集基元覆盖的所有像素。
    2. 是碎片的深度值。管道配置决定该值的执行情况。例如。如果您有标准深度测试,管道将比较片段的深度值和当前像素的深度值,并更新像素的深度值,如果它大于片段的深度值(即,如果片段位于投影到该像素上的其他所有东西的前面)。
    3. 这一点从上面的论述中应该就清楚了。片段与像素直接对应。
    4. 也应回答。它们不是三角形。

    以上所有内容都假设了一些基本的渲染设置,以使阐述更加清晰。更先进的技术,如多重取样等,可能需要对上述陈述稍作修改。

     类似资料:
    • 我有一个用于OpenGL中模型渲染的纹理数组。此数组包含漫反射和镜面纹理。由于某些网格没有镜面纹理,因此我在每次渲染后简单地将NULL纹理绑定到我的镜面采样器,并且只有当网格具有镜面纹理时,我才绑定一个。但是,我仍然在没有镜面纹理的网格上看到镜面纹理。 这是我的渲染代码 材质索引保存数组中纹理的索引,如果网格没有镜面纹理 索引为-1 纹理单元0用于漫反射 纹理单元2用于镜面

    • 本文向大家介绍IIS服务器中的一些名称、术语、概念解释,包括了IIS服务器中的一些名称、术语、概念解释的使用技巧和注意事项,需要的朋友参考一下 1、网站 网站是IIS6中管理的最基本单位,是一个网站的根对象。 主机头设置、日志设置、带宽连接数限制只有在网站级别才可以做,在其他元素下无法做。 2、应用程序 网站中的动态脚本(ASP/PHP/ASP.NET等)内容需要在应用程序池中才可以运行。 每个网

    • 本文向大家介绍OpenGL ES纹理详解,包括了OpenGL ES纹理详解的使用技巧和注意事项,需要的朋友参考一下 使用前面学过的技术已经可以利用OpenGL ES构建立体图形,并通过顶点着色器和片元着色器对其进行各种变化呢和光照等效果使得三维效果更加真实,实际上我看看到很多的3D游戏漂亮多了,那是因为有各种各样的漂亮的图像带给人很多视觉盛宴,这篇文章在前面的基础上,增加物体的表面贴图,使得物体更

    • 我需要在着色器中使用两个纹理,一个在顶点着色器中,另一个在片段着色器中。在这两种情况下,它们都在着色器中引用,例如

    • 问题内容: 我是TensorFlow的新手。在阅读现有文档时,我发现该术语确实令人困惑。因此,我需要澄清以下问题: 和, vs. ,’张量’vs.之间是什么关系? 它们都是张量类型吗? 问题答案: TensorFlow没有一流的Tensor对象,这意味着在运行时执行的基础图中没有任何概念。相反,该图由相互连接的op节点组成,代表操作。操作分配内存的输出,这些都可以在端点上,等等,你可以认为这些端点

    • 我想在1D纹理中提供一组值。请考虑以下简单示例: 在这里,是我要在纹理中存储的值的数量。但是,在我的片段着色器中调用会产生(无论我设置了什么)。那么,这里出了什么问题? 编辑:上面的代码在初始化时执行。我的渲染循环看起来像 我的顶点着色器由一个不起任何作用的-函数组成。我正在使用几何体着色器创建一个全屏四边形。像素着色器代码如下所示 结果是一个红色的窗口。