天道酬勤,学无止境

我们应该将 OpenGL 用于 2D 图形吗?(Should we use OpenGL for 2D graphics?)

问题

如果我们想制作像 MS Paint 这样的应用程序,我们应该使用 OpenGL 来渲染图形吗? 如果使用传统的 GDI 与 OpenGL,我想提一下性能。 如果为此目的存在一些更好的库,请看我一个。

回答1

GDI、X11、OpenGL... 是渲染 API,即您通常不会将它们用于图像处理(您可以这样做,但需要一些预防措施)。

在像 MS Paint 这样的绘图应用程序中,如果它是基于像素的,您通常会使用常规代码或特殊的图像处理库来操作一些图片缓冲区,然后将完整的缓冲区发送到渲染 API。

如果您的数据模型由笔划和单独的形状(即矢量图形)组成,那么 OpenGL 是一个非常好的后端。 但是,可能值得研究一些其他用于矢量图形的 API,例如 OpenVG(在其当前实现中位于 OpenGL 之上,但可能会出现直接在 GPU 上运行的本机实现)。

在您的使用场景中,您不会在当前计算机上遇到任何性能问题,因此不要从该标准中选择您的 API。 在纹理、alpha 混合等方面,OpenGL 绝对比 GDI 快。但是,取决于系统和 GPU,纯 GDI 在绘制弧线或使用复杂的缠绕规则填充复杂的自相交多边形等简单的事情上可能优于 OpenGL。

回答2

没有充分的理由为此使用 OpenGL。 除非你有多年的 GDI 经验,但对 OpenGL 一无所知。

另一方面,在许多情况下,OpenGL 很可能会更胜一筹。 如果计算机中有相当新的卡,则在 GLSL 着色器中合成图层或调整色调/饱和度/亮度/对比度将快几个数量级(实际上,几乎是“立即”)。 使用“模糊”笔(即一遍又一遍地将精灵与 alpha 透明度混合)抚摸自由绘制路径将快几个数量级。 在尺寸合理的图像上,大多数过滤器内核应该接近实时运行。 使用双线性过滤重新缩放在硬件中运行。

这样的事情在 512x512 图像上无关紧要,因为在这样的分辨率下几乎所有东西都是瞬时的,但是在数码相机的典型 4096x3072(或更大)图像上,它可能非常明显,特别是如果你有 4-6 层.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用 3D 加速的图形渲染(Graph rendering using 3D acceleration)
    问题 我们为庞大的数据集生成图表。 我们说的是每秒 4096 个样本,每张图 10 分钟。 一个简单的计算使得每个折线图有 4096 * 60 * 10 = 2457600 个样本。 每个样本都是一个双精度(8 字节)精度的 FP。 此外,我们在一个屏幕上渲染多个折线图,最多大约一百个。 这使我们能够在单个屏幕中渲染大约 2500 万个样本。 使用常识和简单的技巧,我们可以使用 CPU 在 2D 画布上绘制此代码,从而提高此代码的性能。 高性能,即渲染时间低于一分钟。 由于这是科学数据,我们不能省略任何样本。 说真的,这不是一个选择。 甚至不要开始考虑它。 自然,我们希望使用所有可用技术来改善渲染时间。 多核、预渲染、缓存都很有趣,但不要削减它。 我们希望这些数据集的渲染速度至少为 30FPS,首选 60FPS。 我们现在这是一个雄心勃勃的目标。 卸载图形渲染的一种自然方式是使用系统的 GPU。 GPU 用于处理庞大的数据集并并行处理它们。 一些简单的 HelloWorld 测试向我们展示了使用 GPU 渲染速度的昼夜差异。 现在的问题是:像 OpenGL、DirectX 和 XNA 这样的 GPU API 是为 3D 场景而设计的。 因此,使用它们来渲染 2D 线图是可能的,但并不理想。 在我们开发的概念证明中,我们遇到需要将 2D 世界转换为 3D 世界。 突然
  • GDI,GDI +和OpenGL是否真的过时/过时了? [关闭](Are GDI, GDI+ and OpenGL really obsolete/deprecated? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 改善这个问题 如果您在microsoft.com上打开“图形和游戏(Windows)”页面 最后一个类别被描述为 传统图形:已过时且不应在新应用程序中使用的技术。 此类别包括(其中包括)以下API: GDI GDI + 的OpenGL 你怎么看? 如果我今天想推出一个新软件,它必须支持Windows XP(仍然占所有已安装系统的50%)。 Direct2D需要Windows 7 / Vista。 还应该使用什么? 回答1 我怀疑微软对“传统”的定义与任何明智的开发人员应该做什么无关,而是基于Windows API的“大重写”。 从Windows Vista开始,Microsoft一直在重新设计其许多API。 现在,我们将MMDevAPI作为一个True Sound API,将WIC作为一个True Image File API,依此类推。据我所知,这些新API比旧API更好,并且“旧版”系统都可以正常工作基于新的。 在Windows Vista和更高版本中,DirectSound完全基于MMDevAPI,需要读取图像文件的组件可以通过WIC进行操作。 Windows 8将具有ARM版本,该版本似乎仅支持当前Windows
  • iPhone棋盘游戏:OpenGL ES或CoreGraphics? [关闭](iPhone board game: OpenGL ES or CoreGraphics? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 我想为iPhone编写一个棋盘游戏(类似于跳棋)。 OpenGL ES或CoreGraphics将是更好的选择吗? App Store上大多数此类游戏使用什么? 回答1 实际上,在这种情况下,我建议使用的是Core Animation甚至UIViews本身。 如果通过Core Graphics在单个视图中直接绘制所有元素,然后为每个动画帧刷新该视图,您将获得可怕的性能。 我建议将游戏板的离散元素(棋子,柜台,棋盘正方形等)绘制为单独的UIViews或CALayers,然后为周围的这些层或视图设置动画。 UIView并不比CALayers重太多,并且它们在后台使用Core Animation来进行简单的移动,缩放或淡入淡出的动画。 他们还可以响应触摸事件。 如果您想构建更跨平台(Mac和iPhone)的游戏,或者需要制作更复杂的动画,则CALayers很有用。 对于2-D游戏,我将暂不使用OpenGL,直到您完全确定无法从Core Animation获得所需的性能。 OpenGL的代码不那么优雅。 对于如何使用Core
  • 我可以使用 OpenGL 进行离屏渲染吗? [复制](Can I use OpenGL for off-screen rendering? [duplicate])
    问题 这个问题在这里已经有了答案: 如何使用 GLUT/OpenGL 渲染到文件? (5 个回答) 7年前关闭。 我想尝试制作一个简单的程序,该程序采用 3D 模型并将其渲染为图像。 有什么方法可以使用 OpenGL 渲染图像并将其放入保存图像而不是显示图像的变量中吗? 我不想看到我正在渲染的内容,我只想保存它。 有没有办法用 OpenGL 做到这一点? 回答1 我假设您知道如何使用 OpenGL 将内容绘制到屏幕上,并且您编写了一个函数,例如drawStuff来执行此操作。 首先,您必须决定最终渲染的大小; 我在这里选择一个正方形,大小为 512x512。 您还可以使用不是 2 的幂的大小,但为了简单起见,让我们暂时坚持这种格式。 有时 OpenGL 对这个问题很挑剔。 const int width = 512; const int height = 512; 然后你需要三个对象来创建一个离屏绘图区; 正如 user1118321 所说,这称为帧缓冲区对象。 GLuint color; GLuint depth; GLuint fbo; FBO 存储了一个颜色缓冲区和一个深度缓冲区; 您的屏幕渲染区域也有这两个缓冲区,但您不想使用它们,因为您不想绘制到屏幕上。 要创建 FBO,您只需在启动时执行以下操作: glGenTextures(1, &color)
  • 我应该用什么来显示游戏图形?(What should I use to display game graphics?)
    问题 我有一个游戏系统,但我不知道我应该用什么来显示它。 我正在制作一个垂直射击游戏,我已经为所有控制敌人和玩家的类编写了方法,但我不知道如何有效地显示游戏。 我在想一个 Canvas,它会重新绘制每一帧,但这真的是最有效的方法吗? 重要细节: 理想帧率:25fps 这是一个2d游戏屏幕上同时有 25-100 个物体,所有物体都在移动显示的所有对象均为图像,均为 PNG 格式窗口为 640 像素 x 480 像素现在所有的图像都作为 BufferedImage 加载,虽然我可以很容易地改变它 7. 我需要一个坐标平面。 这是唯一不能在不完全重构我的代码的情况下更改的基本部分。 最重要的是我设置好所有东西的方式,每一帧所有对象都在我设计的坐标平面中移动和交互(处理碰撞检测和移动,没有图形组件),然后一切都应该被绘制到屏幕上,只需通过通过 ArrayLists 跟踪所有移动的对象并一一绘制它们。 回答1 如果 Swing 是可以接受的, JPanel默认是双缓冲的,一个周期为 40 ms 的javax.swing.Timer会给你 ~25 Hz 的更新。 此示例显示了基本方法,而此示例显示了许多运动图像。 我需要一个坐标平面。 模型和视图使用不同的坐标并不罕见; 所需要的只是将一个系统映射到另一个系统的函数。 在这个游戏中,视图依赖于将图块映射到像素的四种方法,反之亦然。
  • PyGame做3d吗?(Does PyGame do 3d?)
    问题 我似乎在任何地方都找不到这个问题的答案。 我意识到您必须使用PyOpenGL或类似的东西来做OpenGL的工作,但是我想知道是否有可能在没有任何其他依赖的情况下做非常基本的3D图形。 回答1 不,Pygame是SDL(一种2D API)的包装。 Pygame不提供任何3D功能,而且可能永远不会提供。 适用于Python的3D库包括Panda3D和DirectPython,尽管它们使用起来可能非常复杂,尤其是后者。 回答2 好吧,如果您可以做2d,那么您总可以做3d。 实际上,所有3d都是倾斜的2维曲面,给人的印象是您在深度查看事物。 真正的问题是它能否做好,甚至您愿意。 浏览pyGame文档一段时间后,看起来它只是一个SDL包装器。 SDL不适用于3D编程,因此,对真正问题的答案是,不,我什至不会尝试。 回答3 您只能使用pygame进行伪3D游戏(例如“ Doom”): http://code.google.com/p/gh0stenstein/ 如果您浏览pygame.org网站,则可能会发现更多使用python和pygame完成的“ 3d”游戏。 但是,如果您真的想进行3D编程,则应该查看OpenGl,Blender或任何其他真正的3d库。 回答4 Python Soya可以在pygame曲面上渲染3d图形。 回答5 如果您需要3D投影功能以及所有这些功能
  • OpenGL中的着色器是什么,我们需要它们吗?(What are shaders in OpenGL and what do we need them for?)
    问题 我不是英语母语人士,当我尝试浏览openGL Wiki和www.learnopengl.com上的教程时,凭直觉无法理解整个概念的工作原理。 有人可以用更抽象的方式向我解释它是如何工作的吗? 什么是顶点着色器和片段着色器,我们将它们用于什么? 回答1 OpenGL Wiki提供了一个很好的定义: Shader是用户定义的程序,旨在在图形处理器的某些阶段运行。 过去,图形卡是不可编程的硅片,它们执行一组固定的算法: 输入:三角形的3D坐标,其颜色,光源输出:2D图像 所有这些都使用单个固定的参数化算法,通常类似于Phong反射模型。 来自Wiki的图片: 但这对于想要创建许多不同的复杂视觉效果的程序员来说太过严格了。 因此,随着半导体制造技术的进步,GPU设计人员能够每平方毫米增加更多的晶体管,供应商开始允许将渲染管线的某些部分编程为类似C的GLSL之类的编程语言。 然后,这些语言将转换为未公开的半指令集,这些指令集可在内置于这些较新GPU的小型“ CPU”上运行。 刚开始,那些着色器语言甚至还没有图灵完成! 通用GPU(GPGPU)一词是指现代GPU的这种可编程性提高。 在OpenGL 4模型中,仅下图的蓝色阶段是可编程的: 图片来源。 着色器从上一个管线阶段获取输入(例如,顶点位置,颜色和栅格化像素),然后将输出自定义到下一个阶段。 最重要的两个是: 顶点着色器: 输入
  • 在 OpenGL 中绘制 2D 纹理 [关闭](Drawing a 2D texture in OpenGL [closed])
    问题 关闭。 这个问题需要调试细节。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 6年前关闭。 改进这个问题 我有一个名为DrawImage的绘图函数,但它真的很令人困惑,并且只能使用特定形式的 reshape 函数,所以我有两个问题: 如何在 OpenGL 中绘制纹理? 我只想创建一个函数来获取纹理、x、y、宽度、高度和角度,然后根据参数绘制它。 我想定期将其绘制为 GL_QUAD,但我不知道该怎么做了.-。 人们说我应该使用 SDL 或 SFML 来这样做,是否推荐? 如果是,你能给我一个加载纹理和绘制纹理的简单函数吗? 我目前正在使用 SOIL 加载纹理。 功能如下: void DrawImage(char filename, int xx, int yy, int ww, int hh, int angle) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, filename); glLoadIdentity(); glTranslatef(xx,yy,0.0); glRotatef(angle,0.0,0.0,1.0); glTranslatef(-xx,-yy,0.0); // Draw a textured quad glBegin(GL_QUADS)
  • 用于图形应用程序的快速、像素精度 2D 绘图 API?(Fast, Pixel Precision 2D Drawing API for Graphics App?)
    问题 我想创建一个跨平台的绘图程序。 编写我的应用程序的一个要求是我在画布上具有像素级精度。 例如,我想编写自己的画线算法而不是依赖其他人。 我不想要任何形式的抗锯齿(同样,需要像素级控制。)我希望屏幕上的用户交互快速响应(等待我编写快速算法的能力。) 理想情况下,我想用 Python 或 Java 作为第二选择来编写它。 轻松使最终应用程序跨平台的能力是必须的。 如有必要,我将提交给不同操作系统上的不同 API,只要我可以围绕它们编写抽象层。 有任何想法吗? 附录:我需要在屏幕上绘图的能力。 绘制到我已经弄清楚的文件中。 回答1 我刚刚在本周整理了一些幻灯片和演示代码,用于使用库 pyglet 从 python 中使用 OpenGL 来制作 2d 图形。 你可以在这里看到我的东西:http://tartley.com/?p=378 它非常快(相对而言,对于 python)我已经设法让大约 1,000 个独立定位和定向的对象在屏幕上移动,每个对象有大约 50 个顶点。 它非常便携,我在这个环境中编写的所有代码都可以在 windows、Linux 和 mac(甚至像 Pypy 这样晦涩的环境)上运行,而我无需考虑它。 更新:还有一堆关于同一主题的较新帖子:http://tartley.com/?cat=27 回答2 Python 的 Pyglet 库可能适合您的需求。 它允许您使用
  • 用于简单iPhone游戏的Core Animation或OpenGL(Core Animation or OpenGL for simple iPhone game)
    问题 我正在编写一个简单的游戏,可以在背景图像上快速为球图像设置动画。 在这种情况下,Core Animation / Quartz是否足够? 我真的不想学习OpenGL ES,如果它不能在这个脱离项目的项目中提供任何实质性的好处。 回答1 这是一个常见问题。 其他类似的问题包括: “ iPhone棋盘游戏:OpenGL ES或CoreGraphics?” “ iPhone上的大多数游戏都使用OpenGL ES完成吗?” “核心动画还是OpenGL ES?” “就高度动画化的用户界面而言,openGL ES的性能是否比Core Animation和UIKit更好?” 回答2 我认为OpenGL ES不太难。 但是归根结底,Core Animation会很好,它超级强大且不难使用。 它还将使您起步并运行得如此之快,以至于您会稍微释放游戏“糟透了”,并且想要对其进行更改,甚至不必学习OpenGL。 我强烈建议您查看cocos2d。 一个非常简单的2d游戏引擎。 http://cocos2d.org/ 看一看。 干杯,约翰 回答3 OpenGL ES并不难,网络上以及分步教程中有很多非常好的资源。 刚开始时可能很难,但是一旦掌握了它,事情就会变得很容易。 71 Squared有非常详细的教程: http://www.71squared.co.uk/iphone-tutorials/
  • Mac dev - 帮助开始使用 2d 游戏(Mac dev - Help getting started with 2d games)
    问题 我想制作一些简单的 2d 游戏/克隆(适用于 Mac),但我有几个问题: 我应该使用Quartz 2d还是OpenGL (我不打算很快尝试 3d) 似乎有很多 typedef'd 的东西,比如 CGFloat/GLfloat,我应该使用哪个? 我也应该在游戏中使用 Objective-C(类)还是只使用 C? (我假设我将使用 Objective-C 和 Cocoa 作为窗口和视图。) 每次都重绘整个视图可以吗? 我真的不明白 NSView 的 -drawRectdirtyRect 参数是如何工作的,它怎么知道我想要更新什么? 有什么好的教程吗? 谢谢。 回答1 Quartz 或 Core Animation vs. OpenGL 实际上取决于你想要做什么。 如果您想要简单的绘图和动画,请使用 Quartz 或 CA。 如果您想要快速/强大的游戏,请使用 OpenGL。 最后,我建议两者都学习。 对于 typedef 的东西,请使用适用于您正在使用的特定系统的任何一种。 对于 Quartz/CA/CG,使用 CGFloat。 对于 OpenGL,请使用 GLfloat。 Objective-C 与 C 也取决于你想要的速度。 Objective-C 增加了一点开销,但(显然)会让您创建更多面向对象的游戏。 如果您使用 Quartz 和 Core Animation,我建议使用
  • 用于 OpenGL 的 2D 矢量图形渲染器 [重复](2D Vector graphic renderer for OpenGL [duplicate])
    问题 这个问题在这里已经有了答案: 在 OpenGL 中渲染矢量图形? [重复] (5 个回答) 3年前关闭。 我想在 OpenGL 游戏中使用矢量图形。 我想使用矢量图形,因为它们可以廉价地缩放而不会降低质量。 当然,绘图应该是硬件加速的,所以我不想在软件中绘制纹理。 现在我想知道是否已经存在这样做的图书馆。 是否有一个库,可以加载一些矢量图形格式并使用 OpenGL 显示它? 回答1 我不会理会任何 OpenVG,甚至不会使用 MonkVG,这可能是最现代的,尽管不完整的实现。 OpenVG 委员会在 2011 年已经倒闭,并且大多数(如果不是全部)实现都是废弃软件或充其量是遗留软件。 自 2011 年以来,最先进的是 Mark Kilgard 的宝贝NV_path_rendering ,它目前只是供应商 (Nvidia) 的扩展,您可能已经从其名称中猜到了。 有很多关于它的材料: https://developer.nvidia.com/nv-path-rendering Nvidia hub,但登陆页面上的一些材料不是最新的 http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/opengl/gpupathrender.pdf Siggraph 2012 论文 http://on
  • R 中的高性能 2D OpenGL 图形用于使用 qtpaint (qt) 或 rdyncall (SDL/OpenGL) 包快速显示光栅图像?(Performant 2D OpenGL graphics in R for fast display of raster image using qtpaint (qt) or rdyncall (SDL/OpenGL) packages?)
    问题 对于我在 R & Rcpp+OpenMP & Shiny 中制作的实时交互式 Mandelbrot 查看器,我正在寻找一种将 1920x1080 矩阵显示为光栅图像的高性能方式,希望能够实现大约。 5-10 fps(计算 Mandelbrot 图像本身现在可以在中等变焦下达到大约 20-30 fps,当然滚动应该很快)。 使用image()与选项useRaster=TRUE , plot.raster甚至grid.raster()现在仍然不削减它,所以我在寻找一个更高性能的选择,最理想的是采用OpenGL加速。 我注意到有 qt 包装包qtutils和qtpaint http://finzi.psych.upenn.edu/R/library/qtutils/html/sceneDevice.html,您可以在其中设置参数opengl=TRUE和 http://finzi.psych .upenn.edu/R/library/qtpaint/html/qplotView.html 再次使用参数opengl=TRUE和 http://finzi.psych.upenn.edu/R/library/qtpaint/html/painting.html。 而且我还注意到应该能够使用rdyncall包调用 SDL 和 GL/OpenGL 函数(从 https://cran.r
  • 有人可以解释每像素碰撞检测吗?(Can someone explain per-pixel collision detection?)
    问题 有人可以解释它的优缺点以及与之相关的任何数学吗? 回答1 对于 2D:这个问题不需要任何数学运算,只需要一个自定义的 bitblit 例程。 您将通过将碰撞候选者的碰撞掩码绘制到该表面上并检查您只想绘制的像素是否为 (pixel != 0) 来将碰撞候选者 blit 到隐藏表面。 然后你会发生碰撞。 当然,如果可能发生碰撞,您应该通过边界矩形进行预检查。 对于 3D:您将需要数学(很多)! 基本上,您将根据敌人的每个表面检查演员的每个表面。 这将通过计算平面射线相交来完成。 这里有很多可能的优化,但这取决于您的 3d 表示。 这也不是 Per-Pixel-Collision,而是 Per-Vertex-Collision 回答2 我将首先回答逐像素碰撞检测的优缺点,然后再考虑数学方面。 每像素碰撞检测,也称为像素完美碰撞检测,也许更准确地说是基于图像的碰撞检测,是寻找表示为图像的碰撞对象之间的碰撞。 这种空间方法与更多的几何方法形成对比,后者使用多边形和其他几何形状来表示碰撞对象。 对于 2D,通常有 3 种不同的选项: 基于图像简单的几何形状(轴对齐的边界框、圆形) 复杂的几何形状(凸多边形、凸多边形、椭圆等) 基于图像的碰撞检测精确且易于使用和理解。 对于使用图像进行绘图的游戏,使用基于图像的碰撞检测意味着每当屏幕上的精灵重叠时,它们在碰撞检测系统中也会重叠。
  • 是否有同时具有像素完美绘图和 2D 硬件加速的 2D 图形 API? [关闭](Is there a 2D graphics API with both pixel perfect drawing and 2D hardware acceleration? [closed])
    问题 关闭。 此问题不符合 Stack Overflow 准则。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 4年前关闭。 改进这个问题 目前我们正处于制作 2D 游戏的第一阶段,该游戏将专注于可破坏的环境和物体。 然而,我们在选择正确的图形 API 方面已经遇到了严重的问题 目前,我们使用SDL - 但我们看到它的问题是它的性能不高,并且没有硬件加速的表面缩放和旋转! - 这也使得动画相机变焦几乎不可能 我们也考虑过使用OpenGL ,但是我们看到的问题是我们需要的直接像素访问。 你认为这会是正确的选择吗? 我们正在寻找的是一个图形 API,它是硬件加速的,提供直接的像素访问和修改以及表面的快速块传输、旋转和缩放 回答1 OpenGL 可以为您提供直接的像素访问,但有时很难理解为什么它没有某些功能...... glDrawPixels 可能是最简单和最可靠的方法——你可以将一块像素从“常规”内存复制到帧缓冲区——这不是特别快,但它很旧(MSDN 记录了它很旧),得到很好的支持平台(和硬件),并为您提供对像素渲染的完全控制和准确性 - 您甚至可以对所有渲染逻辑进行编程以在 CPU 上运行,并将其用于绘制像素。 但是,尝试利用使用硬件的性能优势可能是明智的...... 使用硬件很好,但即使是最简单的操作也不能保证像素完美的精度
  • 为什么说 WebGL 是 2D API,而不是 3D API?(Why does this state that WebGL is a 2D API, not a 3D API?)
    问题 根据 HTML5 Rocks 的说法,WebGL 实际上是一个 2D API,而不是一个 3D API。 他们为什么这么说,这是什么意思? 我们可以在 WebGL 顶点着色器和片段着色器中指定 X、Y、Z 坐标。 我无法理解 2D 和 3D 图形 API 之间的区别。 你能解释为什么他们说这是一个 2D API? 回答1 WebGL 是一个光栅 API 而不是 3D api。 您必须为其提供投影坐标。 这许多方面它与 Canvas 没有什么不同。 它只是更快。 我们比较一下。 这是 Canvas 中的 3D const cubeVertices = [ -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, ]; const indices = [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7, ]; const canvas = document.querySelector("#c"); const ctx = canvas.getContext("2d"); function render(time) { time *= 0.001; const scale = 2
  • [learnOpenGL学习笔记_3] 你好,三角形
    你好,三角形 文章目录 你好,三角形0. 预备知识0.1 图形渲染管线 1. 顶点输入2. 顶点缓冲对象(VBO)2.1 概念2.2 创建及配置 3. 顶点数组对象(VAO)3.1 概念3.2 创建及配置 4. 链接顶点属性5. 构造着色器5.1 顶点着色器5.2 片段着色器5.3 编译着色器5.4 链接着色器 6. 画三角形7. 总结8. 一些名词8.1 标准化设备坐标(Normalized Device Coordinates, NDC) 9. 全部源码 learnOpenGL网站是学习openGL非常有用的网站,作为一个小白,为了方便后续回顾同时给大家提供借鉴,在此记录学习的过程。 本文参考:你好,三角形 0. 预备知识 三角形是怎样画到屏幕上的? 想要显示三角形,需要准备什么素材? 在开始写代码之前,我们应该首先了解上面两个问题。 0.1 图形渲染管线 下面两段的意思总结起来就是:图形渲染管线将3D坐标通过一步一步的处理变为屏幕上显示的2D像素,而一步一步的处理是通过各种着色器实现的。如果不想读下面的官方理论,可以直接看图,图中表示了图形渲染管线处理顶点的过程。 在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线
  • OpenGL学习笔记4-Hello Triangle
    Hello Triangle 在OpenGL中,所有东西都是在3D空间中,但屏幕或窗口是一个2D像素数组,所以OpenGL的大部分工作是关于将所有3D坐标转换为适合屏幕的2D像素。将三维坐标转换为二维像素的过程由OpenGL graphics pipeline 管理。图形管道可以分为两大部分:第一部分将3D坐标转换为2D坐标,第二部分将2D坐标转换为实际的彩色像素。在这一章中,我们将简要讨论图形管道,以及如何利用它来创建花哨的像素。 图形管道接受一组3D坐标作为输入,并将它们转换为屏幕上的彩色2D像素。图形管道可以分为几个步骤,每个步骤都需要前一个步骤的输出作为输入。所有这些步骤都是高度专门化的(它们只有一个特定的功能),可以很容易地并行执行。由于并行的特性,现在的显卡有成千上万的小处理核,可以在图形管道中快速处理数据。为流水线的每一步处理核在GPU上运行小程序。这些小程序叫做着色器(shaders)。 这些着色器中的一些是可由开发者配置的,这允许我们写我们自己的着色器来取代现有的默认着色器。这给了我们更细粒度的控制特定部分的管道,因为他们运行在GPU上,他们也可以节省我们宝贵的CPU时间。着色器是用OpenGL着色语言(GLSL)(OpenGL Shading Language (GLSL))编写的,我们将在下一章深入研究。 下面是图形管道所有阶段的抽象表示。请注意
  • 用于游戏开发的二维矢量建模(2D vector modelling for game development)
    问题 制作我的 Asteroids 克隆(在 C 中)我更喜欢基于矢量的实体,但我只是将它们编码为 x,y 点数组。 对于像 Asteroids 这样的东西来说这很好,但是如果我想制作更复杂的 2D 模型应该怎么做? 我注意到有大量的 3D 建模软件,以及大量的教程和帮助,可以将 3D 模型导入一个人的 C/C++ 程序以与 Open GL 一起使用。 然而,相比 3D,我对创建基于矢量的 2D 模型更感兴趣,因为我非常乐意继续尝试 2D 游戏一段时间。 是否存在 2D 建模这样的概念? 是否有用于创建和导出 2D 模型的工具和用于专门导入 2D 模型的库,还是只是在 3D 软件中创建平面模型,然后导入这些文件(例如 .3ds、.ms3d)并将它们平放在 z 轴上? 到目前为止,我唯一的想法可能是使用 Inkscape 之类的东西进行建模,生成 SVG 文件,然后使用 Cairo 导入和渲染它们。 这会奏效吗,或者您有其他建议吗? 注意我是任何类型建模的新手,所以我可能会问一个愚蠢的问题...... 回答1 就二维矢量游戏编程而言,它通常是 Flash 和 Flex 的领域。 仍然 SVG 并通过开罗加载它似乎是一个可行的解决方案。 尽管我会注意确保您启用了硬件加速(最好是 OpenGL 后端)。 就 2D 格式而言,对于任何格式,您都不会获得对 SVG 的良好支持
  • 优化 iPhone OpenGL ES 填充率(optimizing iPhone OpenGL ES fill rate)
    问题 我在 iPhone 上有一个 Open GL ES 游戏。 我的帧率非常糟糕,~20fps。 在 iPhone 3G 上使用 Xcode OpenGL ES 性能工具,它显示: 渲染器利用率:95% 到 99% 瓷砖利用率:~27% 我正在绘制很多非常大的图像,并进行了大量混合。 如果我减少绘制的图像数量,帧率会从 ~20 到 ~40,尽管性能工具结果保持不变(渲染器仍然最大化)。 我想我受到 iPhone 3G 填充率的限制,但我不确定。 我的问题是:如何更精确地确定瓶颈在哪里? 这是我最大的问题,我只是不知道一直在消耗什么。 如果是填充率,除了减少绘制之外,还有什么可以改进它的吗? 我正在使用纹理图集。 我试图最小化图像绑定,尽管这并不总是可行的(绘制顺序,并非所有内容都适合一个 1024x1024 纹理等)。 每帧我做 10 个图像绑定。 这看起来很合理,但我可能会弄错。 我正在使用顶点数组和 glDrawArrays。 我真的没有很多几何。 如果需要,我可以尝试更精确。 每个图像都是 2 个三角形,我尝试将事情分批进行,尽管经常(可能有一半的时间)图像是通过单独的 glDrawArrays 调用绘制的。 除了图像之外,我还有大约 60 个三角形的几何图形在大约 6 个 glDrawArrays 调用中渲染。 我经常在调用 glDrawArrays 之前进行