Questions tagged «opengl»

OpenGL是针对台式机和工作站市场的图形标准和API。它的设计易于通过专用计算机硬件进行加速,因此与传统的软件渲染相比,大多数实现方式都可以大大提高性能。当前,OpenGL用于CAD软件和计算机游戏等应用程序。它也是跨平台的。OpenGL标准由Khronos组控制,该组还控制OpenGL ES。

3
在隐藏网格的位置/位置如何隐藏后处理的网格轮廓
我正在3D引擎中设置活动轮廓,为选定的3d角色或屏幕上的风景设置高光效果。在使用模板缓冲区并获得一些不满意的结果(形状问题为凹形,由于距相机的距离导致轮廓线厚度以及台式机和笔记本电脑之间的不一致)后,我切换到边缘检测和帧缓冲区采样并得到了轮廓很满意。 但是,当选定的网格位于另一个网格之后时,我无法隐藏轮廓。考虑到我的过程,这很有意义,因为在渲染场景的其余部分之后,我只是从帧缓冲区中渲染了2d着色器轮廓。 下面是我的结果的两个屏幕截图。第一个是“好”轮廓,第二个是在阻挡轮廓源的网格上看到轮廓的位置。 渲染过程如下所示:1)仅绘制突出显示的网格的alpha,在帧缓冲区(framebuffer1)中捕获黑色轮廓。 2)将纹理从framebuffer1传递到执行边缘检测的第二个着色器。在framebuffer2中捕获边缘。 3)渲染整个场景。 4)在场景顶部从framebuffer2渲染纹理。 我对如何完成工作有一些想法,希望能收到关于其有效性或更简单或更佳方法的反馈。 首先,我考虑过将整个场景渲染到帧缓冲区,并将突出显示的网格的可见轮廓存储在alpha通道中(所有白色保存,突出显示的网格可见)。然后,我将在alpha通道上执行边缘检测,渲染场景帧缓冲区,然后在顶部渲染边缘。结果是这样的: 为此,我想到了仅在突出显示对象的渲染过程中设置一个定义,该定义将为所有可见像素在alpha中绘制所有黑色。 我的第二个想法是使用上面概述的当前渲染过程,而且在渲染选定网格的轮廓时,还将X,Y和Z坐标存储在framebuffer1的R,G和B通道中。边缘检测将被执行并存储在framebuffer2中,但是我会将RGB / XYZ值从alpha的边缘传递到轮廓。然后,在渲染场景时,我将测试坐标是否在framebuffer2中存储的边缘内。如果是这样,我将测试当前片段的深度,以确定它是在从RGB通道提取的坐标之前还是之后(转换为相机空间)。如果片段在深度坐标之前,则片段将正常渲染。如果片段在后面,则将其呈现为纯轮廓颜色。 我正在为该项目使用LibGDX,并且希望支持WebGL和OpenGL ES,因此我没有涉及几何着色器或更新的GLSL函数的解决方案。如果有人可以评论我提出的方法或提出更好的建议,我将非常感激。

1
利用游戏循环和openGL之间的多线程
在基于openGL渲染器的游戏环境中交谈: 假设有两个线程: 更新游戏中对象的游戏逻辑和物理等 根据游戏对象中的数据对每个游戏对象进行openGL绘制调用(线程1不断更新) 除非您在游戏的当前状态下每个游戏对象都有两个副本,否则您必须暂停线程1,而线程2进行抽奖,否则游戏对象将在该对象的抽奖中途更新。是不可取的! 但是停止线程1以安全地从线程2进行绘制调用会杀死多线程/并发的整个目的 除了使用成百上千或同步对象/围栅之外,还有没有更好的方法可以利用多核体系结构提高性能? 我知道我仍然可以使用多线程为尚未成为当前游戏状态一部分的对象加载纹理和编译着色器,但是如何在不影响绘制和更新的情况下对活动/可见对象执行此操作? 如果我在每个游戏对象中使用单独的同步锁怎么办?这样,任何线程都只会阻塞一个对象(理想情况),而不是整个更新/绘制周期!但是在每个对象上锁定(游戏可能有上千个对象)的代价是多少?

1
具有相同位大小的渲染目标为何很重要?
我目前正在考虑需要哪种类型的GBuffer进行延迟着色,因此我也尝试在线上记录最常见的GBuffer及其格式。 我见过的大多数GBuffer都为每个渲染目标使用了相同的位大小,通常还导致未使用的通道。但是,作为我的GBuffer的第一个猜测,在纸上,我需要两个24位目标和两个32个目标,或者三个24和一个32。 我知道每个附件都具有相同的“大小”可以更好地对齐,但是实际上来讲,浪费信道(或保留它们以供将来使用)并拥有所有大小相同的RT更好还是还是应该使用所需的大小?在前一种情况下,为什么有这样的优势,是否仍将24位填充到32位呢?

1
在OpenGL中,什么是“零状态”渲染?
最近在一次工作面试中,我提到我自学了现代OpenGL和如何使用顶点缓冲对象进行渲染,因为我的大学当时只教固定功能管道进行即时模式渲染。面试官简短地打扰了我,说VBO已被“零状态渲染”所代替,然后让我继续。 后来我忘了问这是什么意思了,因为我们很快转到了其他主题,并且由于忙碌的日程表,面试官最终没有时间了。 后来,我在网上搜索了“ OpenGL零状态”和“零状态渲染”,没有似乎相关的结果,大部分只是关于OpenGL状态的信息。 所讨论的组织是基于大量研究的,因此是否有可能是目前很少支持的扩展,还是由于其尖端的性质而使使用的术语有所不同?

2
我应该使用多少个OpenGL程序来渲染多个对象?
我的场景中有多个对象。(假设3个立方体,1个圆柱体,8个球体。)我假设我应该为每个立方体创建一个顶点着色器。我应该有几个程序? 备择方案: 每个对象一个程序 一个程序用于所有立方体,另一个程序用于所有球体(假定它们使用相同的着色器) 一个适用于一切的大型程序 正确的方法是什么?

1
如何有效地渲染大型地形网格?
最近,我一直在思考如何在游戏中生成地形的最佳方法。在另一个项目中,我通常使用高度图,因此所有核心工作都基于所使用的引擎,但是现在无法完成,因为地形具有数百万个必须精确绘制的特定多边形。而且,其中许多不能从Y向量进行解析(因为下面隐藏了多边形),也就是说,高度图在这里没有用。在这种情况下,我必须使用COLLADA对象。 有人告诉我要在Blender之类的软件中手动划分模型,但是不幸的是,这也是不可能的,因为这些地形是在另一个软件中成块创建的,然后加载到游戏中(这就是想法)。因此,每次必须手动对其进行切片将是一项巨大的工作。 因此,自从一周以来,我一直在研究如何解决此问题并以程序方式将此网格,地形(对应于相机平​​截头体)加载,以尽可能地节省性能。我遇到了许多有关过程网格生成的文档,我认为可以通过将网格映射到八叉树来解决我的问题。这是一项巨大的工作,至少对我来说是如此,这就是为什么我在这里,因为我不想冒险走错误的道路,而无需经验丰富的人来信。 简而言之,我有数百万个顶点和索引共同构成了地形,但是出于明显的原因,我无法同时绘制它们。它需要某种程序。将大型网格物体视为地形的最佳方法是什么?有没有关于这本书的具体书?有没有最佳的实施方法? 很抱歉出现任何错误,我是这个领域的新手。

1
引擎渲染管道:使着色器通用
我正在尝试使用OpenGL ES 2.0(目前为iOS)制作2D游戏引擎。我已经在Objective C中编写了Application层,并在C ++中编写了一个独立的RendererGLES20。在渲染器外部不会进行GL特定的调用。运行良好。 但是在使用着色器时,我有一些设计问题。每个着色器都有自己的唯一属性和统一体,需要在主绘制调用之前进行设置(在本例中为glDrawArrays)。例如,为了绘制一些几何图形,我要做: void RendererGLES20::render(Model * model) { // Set a bunch of uniforms glUniformMatrix4fv(.......); // Enable specific attributes, can be many glEnableVertexAttribArray(......); // Set a bunch of vertex attribute pointers: glVertexAttribPointer(positionSlot, 2, GL_FLOAT, GL_FALSE, stride, m->pCoords); // Now actually Draw the geometry glDrawArrays(GL_TRIANGLES, 0, m->vertexCount); // …

2
OpenGL获取多个重叠对象的轮廓
我只是对使用c ++的opengl进行的游戏有一个想法:当玩家赢得某些东西时,我希望在多个重叠的物体上有一个大轮廓(5-6像素)。 我以为最好的方法是使用模板缓冲区,但是尝试在屏幕外渲染模板缓冲区需要几个小时,而且我无法获得任何结果。还有其他一些技巧! 这就是我想要得到的: 有任何想法吗?
10 opengl  outline 

2
使用gl_quads仍有优势吗?
好的,我知道gl_quads已过时,因此我们不再“应该”使用它们。我也了解现代PC在使用gl_quads运行游戏时实际上会绘制两个三角形。 现在,我听说是因为应该使用三角形来编写游戏。但是我想知道,由于OpenGL如何将四边形变成两个三角形,是否仍然有利于使用四边形? 具体来说,我目前正在从相当大的缓冲区对象渲染许多未连接的四边形。我必须要注意的领域之一是,我用来制作/更新这些缓冲区对象的浮点矢量的大小(我每个顶点有很多额外的浮点值,并且缓冲区中有很多顶点-最大缓冲区约为500KB)。 因此,令我惊讶的是,如果我更改缓冲区对象以绘制三角形,则此顶点数据将大50%(六个正方形绘制一个正方形而不是4个顶点),并且CPU生成所需的时间要长50%。 如果gl_quads仍然有效,我在这里能受益吗?还是在OpenGL自动转换为两个三角形时仍在使用50%的额外内存和CPU时间?
10 opengl 

1
如何获得“ 8位图形”外观?
我有很强的编程背景,但并非来自游戏开发。我在高中时只打过乒乓球和蛇,在大学时做了过OpenGL。 我想制作自己的游戏引擎。只是一个简单的2D游戏引擎就没什么了。但是因为我有点老派,而且感觉复古。我希望图形看起来像旧的8位游戏(《超人》,《魂斗罗》,《超级马里奥》等)。 那么,当时的旧游戏是如何制作的?我想要最简单的方法。他们现在是否还在像新引擎一样使用资产(图像)?如何使用OpenGL实现这种渲染? 记住。最简单的解决方案。我想知道当时的制作方法以及如何复制它。甚至不必是OpenGL。我可以在窗户画布上画画。我确实想从头开始。

2
渲染之前对对象进行排序
我正在尝试实现一个场景图,在我遇到的所有文章中都谈到了对象排序。因此,您可以按“材料”对对象进行排序。现在直到我坐下来并开始执行它,我都认为这是理所当然的,因为它是有道理的。但是现在我想知道排序实际上会发生什么变化? 在我的引擎中,我有一个UBO经理,我使用UBO来存储将在程序之间共享的数据,目前仅涉及时间,相机和投影矩阵以及灯光(我不担心管理哪些灯光会影响哪些对象是ATM)。 现在,对于每个模型,我都必须将模型更改为世界矩阵统一模型,而没有排序方法可以改变它。那么,从更改此矩阵到同时为每个对象设置不好的材质的跳转又是不是? 我隐约记得在某处阅读过,每次您更改管道中的某些内容时,都必须将其刷新,这可能会导致性能问题。但是无论如何,对于每个绘图调用,我都会为世界矩阵建立一个模型,因此对这个问题有什么意义呢? 顺便说一句,关于更改制服并调用glBufferSubData是否更(或更少)昂贵,有任何信息。


2
渲染字符,四肢被割断(Java / OpenGL中的Blender模型)
如果我希望肢体可分离,在创建角色动画和渲染类时应该考虑哪些方面?我已经开发了详细的身体系统,可以定义到神经系统的所有内容。我的目标是达到与《矮人要塞》中详细的伤害程度相似的水平。例如,当角色对其上臂造成伤害时,可能会出现神经受损,从而使整个手臂失去能力。否则他们可能会完全失去手臂。 我写了一个系统来处理其中的数据部分。每个角色都有一个箱子,里面有附属物和内部零件。每个附件也可以具有子附件和内部部件。如果禁用或删除了父附件,则将禁用/删除子附件。如果生命中需要任何禁用/拆除的附件或内部零件,角色将很快死亡。 我现在正在研究的是绘图/动画部分。如何定义动画以了解在当前身体状态(缺少手臂/腿等)下允许哪些动画?如何设置绘制系统以不绘制缺少的四肢?每个肢体/附属物都必须是自己的模型吗(我想在地面上画出切除的附属物)? 我正在转换的简单系统(我只是将其编写用于测试)将动画的所有关键帧作为完整模型导入到VBO(以及关键帧开始/停止位置的顶点计数)。它不会导入或利用Blender中定义的骨骼,也不会在帧之间进行插值。 这可能是一个很大的问题,所以我也在寻找可以使我走到哪里的资源。 编辑 我询问有关动画的动画,因为我希望将其设置为在缺少所需肢体的情况下执行其他动画。考虑了这一点之后,我想我会在激活动画之前执行该检查,然后激活相应的动画。

1
变形表面
我正在尝试完成水平曲面的变形物理行为,但到目前为止,尚不知道如何从实现开始。 无论表面的形状(平面,立方体,球体……)如何,我都希望在游戏实体(玩家,敌人,物体……)的位置上有小凹痕。 解释起来有点复杂,所以我说明了我在说什么,这是一个带有球体的示例: 因此,这些表面应该能够使其自身稍微变形(看起来像是真正柔软的床或沙发)。我的曲面可能需要很高的顶点数才能获得平滑的变形,但是我的大问题是计算该变形的数学方法。 我正在用OpenGL用C / C ++进行编程,但是在正确方向上的任何建议都可以。

1
如何在OpenGL中创建“夜空”效果?
我正在使用OpenGL创建游戏,我想渲染其中有几颗星星的夜空的效果。 我想在天空中产生闪亮的黑色效果,以便看起来不错。有人可以帮忙进行下去,也可以提供指向好教程的链接吗?
10 opengl  sky 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.