- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
According to HTML5 Rocks ,WebGL其实是2D API,不是3D API。他们为什么这么说,这是什么意思?
我们可以在 WebGL 顶点着色器和片段着色器中指定 X、Y、Z 坐标。我无法理解 2D 和 3D 图形 API 之间的区别。您能解释一下为什么他们说这是 2D API 吗?
最佳答案
WebGL is actually a 2D API, not a 3D API. What does it mean?
这意味着你应该停止听任何网站或人告诉你的。当人们说这种愚蠢的话时,最好忽略他们并继续进行更合理的教程/信息/讨论。
您当然可以在纯 2D 方面使用 WebGL。您可以将 2D 位置传递给顶点着色器。您可以完全关闭深度测试。等等。但是顶点着色器的输出是 4D homogeneous coordinate ,即使您的 W 为 1 而 Z 为 0。因此渲染系统将执行它通常为 3D 场景执行的所有 3D 数学运算。
是的,光栅化基本上是一个 2D 过程,深度测试作为“hack”以允许隐藏表面移除。但这对所有 基于光栅化的渲染都是如此。按照这种逻辑,D3D、OpenGL、GLIDE 和每个软件光栅器也是“2D API”。
如果它们都是 2D API,那么该语句毫无意义。它将 OpenGL/D3D 置于与 实际“2D API”(如 SDL 和 Direct2D)相同的水平。然而,那些“2D API”根本无法进行 3D 渲染(或者并非没有实质性的痛苦)。
因此,该声明既不符合事实,又极具误导性。谁说这不值得您花时间或关注。
from comments:
最初写这篇“WebGL 是 2D”的人已经屈尊解释了他的推理,所以我将在这里解决这些问题。
让我们使用他对 API 维度的定义。他的确切引述是:
You gave them 3D data and nothing else and they gave you a 3D display. OpenGL ES 2.0 is a 2D api. You have to supply all of the 3D to 2D math conversion yourself.
据此,我们可以推断出“3D API”的意思是“‘您’将 3D 值输入其中以导致 3D 渲染发生的 API”。类似地,“2D API”表示“一种 API,‘您’将 2D 值输入其中以导致 2D 渲染发生。”
让我们假设“你”不仅仅意味着从缓冲区对象中获取的值的维度。 “你”是指你可以直接控制的每一段代码,包括你的着色器。好的。所以对于 WebGL,“你”在顶点着色器的末尾停止。因此,WebGL 开始处理顶点着色器的输出。
顶点着色器的输出是 4D 齐次坐标。我猜这个论点是 4D 齐次坐标在某种程度上与 2D 坐标相同。即使它显然不是,因为它还有 2 个组件,并且您对它们进行的各种数学运算非常不同。
我会让您决定是否要将 4D 齐次坐标视为与 2D 坐标相同。
相反,我将研究 WebGL 如何处理 4D 输出。它是否将其转换为二维坐标? OpenGL 规范说不。
来自 the OpenGL ES 2.0 ,第 2.12 节,第 44 页:
Vertex shader execution yields a vertex coordinate
gl_Position
which is assumed to be in clip coordinates. Perspective division is carried out on clip coordinates to yield normalized device coordinates, followed by a viewport transformation to convert these coordinates into window coordinates (see figure 2.4).
Clip coordinates are four-dimensional homogeneous vectors consisting of x, y,z, and w coordinates (in that order). If a vertex’s clip coordinates are:
(xc, yc, zc, wc)
then the vertex’s normalized device coordinates are
(xd, yd, zd) = (xc/wc, yc/wc, zc/wc)
标准化设备坐标空间有 3 个分量。因此它不是二维空间。但是以后的转换呢?
好吧,来自同一规范的第 2.12.1 节(对开页 44-45):
The viewport transformation is determined by the viewport’s width and height in pixels, px and py, respectively, and its center (ox, oy) (also in pixels). The vertex’s window coordinates, (xw, yw, zw), are given by
xw = (px/2)xd + ox
yw = (py/2)yd + oy
zw = ((f - n)/2)zd + (n + f)/2
是的,甚至窗口空间也是一个 3D 坐标系。窗口空间是 OpenGL 在其计算中使用的最终空间;窗口空间直接进入光栅器。这就是渲染的内容。
因此,根据 OpenGL ES 2.0 规范,在整个渲染管道中没有任何东西可以转换成纯 2D 空间。
WebGL 是一种 API,您可以将 4D 齐次坐标输入其中。 WebGL 绝不会执行任何“3D 到 2D 数学转换”,用户也不会。在 WebGL 中的任何一点都没有人将任何东西转换为 2D 坐标。二维值不是通过二维管道提供的; 4D 值通过 3D 管道提供。
因此,根据他自己的定义,WebGL 不是 2D API。
QED。
关于javascript - 为什么说 WebGL 是 2D API,而不是 3D API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13135210/
一些网站说你应该通过以下方式初始化 webgl: var gl = c.getContext("webgl") || c.getContext("experimental-webgl"); if (!
我一直在寻找有关 WebGL 的信息以及可以分配用于渲染的最大纹理数/内存量。这显然是特定于硬件/设备的,因此我正在寻找一种智能处理纹理的方法。 我目前有 512x512 RGBA8 格式的纹理。一个
我想知道是否可以利用WebGL进行任何异步调用? 我研究了Spec v1和Spec v2,他们什么都没提及。在V2中,有一种WebGL查询机制,我认为这不是我想要的。 在网络上进行搜索并没有确定的定义
我正在参与一个 webgl 项目。 当我调用 gl.DrawElements 时,会显示错误“范围超出缓冲区范围”。 我肯定确保我传递了正确的缓冲区长度或偏移量。但是,仍然显示错误。 我认为有几个原因
我知道 WebGL 中有 8 个纹理的限制。 我的问题是,8 是全局限制还是每个着色器/程序明智的? 如果它是每个着色器/程序明智的限制,这是否意味着,一旦我将纹理加载到一个着色器的制服上,我就可以开
我一直在使用 Haxe + Away3D 编写一个小型行星生成器,并将其部署到 HTML5/WebGL。但是在渲染云时我遇到了一个奇怪的问题。我有行星网格,然后云网格在相同位置稍大一些。 我正在使用柏
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
在 OpenGL 中,深度缓冲区值是根据场景的近和远裁剪平面计算的。 (引用:Getting the true z value from the depth buffer) 这在 WebGL 中是如何
简单的问题,但我无法在任何地方的规范中找到答案。我可能在某处遗漏了明显的答案。 我可以在 WebGL 片段着色器中同时使用多少个纹理?如果它是可变的,那么假设 PC 使用的合理数字是多少? (对移动不
我有一个渲染场景的帧缓冲区,现在我想将它渲染到“全屏”四边形。如何设置我的相机以及我应该在我的顶点着色器中放置什么以便将帧缓冲区的纹理渲染到整个屏幕。 我试过像这样创建一个全屏四边形 var gl =
我正在阅读 here 的教程。 var gl; function initGL() { // Get A WebGL context var canvas = document.getEle
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在学习 WebGL,我能感觉到我的速度很慢,因为我很难调试我的代码。是否有任何扩展或工具可以帮助我知道缓冲区、属性指针、矩阵等的值。 我在谷歌上搜索并了解了 chrome 扩展程序 spector
我可以在某处找到任何文档来记录 WebGL 调用所需的先决条件吗? 我已经对 WebGL 基础有了相当深入的了解,但现在我正在创建自己的“框架”,并且我正在更深入地了解。 例如, enableVert
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
我有兴趣在 webgl 中执行一些密集计算,所以它在 GPU 上运行。 大多数文档都讨论了如何渲染图形。 我正在完成非常简单的任务:对于给定的图像,将其转换为灰度,并找到局部最大值的坐标(比其邻居更亮
我目前在 WebGL 中使用这个片段着色器来对照片纹理应用高光/阴影调整。 着色器本身是直接从优秀的 GPUImage 中拉出来的适用于 iOS 的库。 uniform sampler2D input
我是 webgl 的新手。我正在尝试设置时间统一,因此我可以随着时间的推移更改片段着色器的输出。我认为这实现起来相当简单,但我正在努力。我知道这两种方法可能涉及: https://developer.
我正在尝试使用两个 Canvas 并排绘制相同的 WebGL 场景。是否可以?到目前为止,我还没有走运。 思路如下: 我加载几何 我设置了两个gl上下文,每幅 Canvas 一个 我调用 drawEl
我正在学习 WebGL 并尝试显示一个球体。没有纹理,只有每个顶点着色,但我在 Opera 和 Chrome 中收到以下错误消息:“[.WebGLRenderingContext]GL 错误:GL_I
我是一名优秀的程序员,十分优秀!