Questions tagged «opengl»

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

1
GLSL:如何将浮点数转换为int?
在GLSL片段着色器中,我试图将A投射float为int。编译器会引发错误: ERROR: 0:60: '=' : cannot convert from 'mediump float' to 'highp int' 我试图提高的精度int: mediump float indexf = floor(2.0 * mixer); highp int index = indexf; 但无济于事。 如何int正确投放?
40 opengl  glsl  opengl-es 

5
我应该使用大小不为2的幂的纹理吗?
在OpenGL和DirectX的早期,纹理大小要求是2的幂。这意味着浮点值的内插可以非常快地使用移位等方法完成。 从OpenGL 2.0开始(以及之前的扩展,通过扩展),已支持非二次幂纹理尺寸。 二次幂纹理在现代集成和离散GPU上是否具有性能优势?非二次方纹理有什么优势? 是否有大量台式机拥有支持非二次幂纹理的卡?

6
在OpenGL中创建复古样式的调色板交换效果
我正在开发类似Megaman的游戏,需要在运行时更改某些像素的颜色。供参考:在Megaman中,当您更改所选武器时,主角色的调色板会更改以反映所选武器。并非所有精灵的颜色都会改变,只有某些会改变。 由于程序员可以访问调色板以及像素和调色板索引之间的逻辑映射,因此这种效果在NES上很常见并且很容易实现。但是,在现代硬件上,这更具挑战性,因为调色板的概念并不相同。 我所有的纹理都是32位的,并且不使用调色板。 我知道有两种方法可以达到我想要的效果,但是我很好奇是否有更好的方法可以轻松实现此效果。我知道的两个选项是: 使用着色器并编写一些GLSL来执行“调色板交换”行为。 如果着色器不可用(例如,因为图形卡不支持着色器),则可以克隆“原始”纹理并生成具有预先应用的颜色更改的不同版本。 理想情况下,我想使用着色器,因为它看起来很简单,并且与重复纹理方法相反,几乎不需要其他工作。我担心复制纹理只是为了更改颜色而浪费了VRAM,我不应该为此担心吗? 编辑:我最终使用了可接受的答案的技术,这是我的着色器供参考。 uniform sampler2D texture; uniform sampler2D colorTable; uniform float paletteIndex; void main() { vec2 pos = gl_TexCoord[0].xy; vec4 color = texture2D(texture, pos); vec2 index = vec2(color.r + paletteIndex, 0); vec4 indexedColor = texture2D(colorTable, index); gl_FragColor = indexedColor; } 两种纹理都是32位的,一种纹理用作查找表,其中包含多个大小相同的调色板(在我的情况下为6种颜色)。我将源像素的红色通道用作颜色表的索引。这就像实现类似于Megaman的调色板交换一样具有魅力!


4
OpenGL的顶点数组对象的目的是什么?
我刚开始使用OpenGL,但我仍然还不太了解什么是“顶点数组对象”以及如何使用它们。 如果将“顶点缓冲对象”用于存储顶点数据(例如其位置和纹理坐标),并且VAO仅包含状态标志,则可以在哪里使用它们?他们的目的是什么? 据我从(非常不完整和不清楚)的GL Wiki所了解的那样,使用VAO遵循元素数组缓冲区中描述的顺序为每个顶点设置标志/状态,但是Wiki确实对此含糊不清,我我不确定VAO的实际功能以及如何使用它们。
36 opengl 

7
如何提高Voxel / Minecraft类型游戏的渲染速度?
我正在编写自己的Minecraft副本(也用Java编写)。现在效果很好。在40米的可视距离下,我可以轻松地在MacBook Pro 8,1上达到60 FPS。(英特尔i5 +英特尔高清显卡3000)。但是,如果将可视距离设为70米,则只能达到15-25 FPS。在真实的《我的世界》中,我可以毫无问题地将视距扩大到256m。所以我的问题是我应该怎么做才能使我的游戏变得更好? 我实现的优化: 仅将本地块保留在内存中(取决于玩家的观看距离) 视锥剔除(首先在块上,然后在块上) 只画出真正可见的方块面 对包含可见块的每个块使用列表。可见的块将自己添加到此列表中。如果它们不可见,则会自动从此列表中删除。通过构建或销毁相邻的块,块变得(不可见)。 每个包含更新块的块使用列表。与可见阻止列表相同的机制。 new在游戏循环内几乎不使用任何语句。(我的游戏运行大约20秒钟,直到调用了垃圾回收器) 我目前正在使用OpenGL呼叫列表。(glNewList(),glEndList(),glCallList())一类块的每个侧面。 目前,我什至没有使用任何照明系统。我已经听说过VBO。但是我不知道到底是什么。但是,我将对其进行一些研究。他们会提高性能吗?在实施VBO之前,我想尝试使用glCallLists()并传递呼叫清单列表。而是使用了千次glCallList()。(我想尝试一下,因为我认为真正的MineCraft不使用VBO。对吗?) 还有其他提高性能的技巧吗? VisualVM配置文件向我展示了这一点(仅33帧配置文件,可视距离为70米): 用40米(246帧)进行分析: 注意:我正在同步许多方法和代码块,因为我正在另一个线程中生成块。我认为在游戏循环中进行大量操作时,获取对象的锁是性能问题(当然,我所说的是只有游戏循环而没有新块生成的时间)。这是正确的吗? 编辑:删除一些synchronised块和其他一些小的改进之后。性能已经好得多了。这是我对70米的新分析结果: 我认为这很明显selectVisibleBlocks是这里的问题。 提前致谢! 马丁 更新资料:经过一些额外的改进(例如,使用for循环代替每个循环,在循环外缓冲变量,等等...),我现在可以很好地查看距离60。 我想我将尽快实施VBO。 PS:所有源代码都可以在GitHub上找到:https: //github.com/mcourteaux/CraftMania

5
使用OpenGL(现代方式)绘制大量图块
我正在与一群人一起开发基于图块/精灵的小型PC游戏,但我们遇到了性能问题。我上一次使用OpenGL是在2004年左右,所以我一直在教自己如何使用核心配置文件,但发现自己有些困惑。 我需要每帧在屏幕上绘制250-750个48x48瓦片附近,以及大约50个精灵。磁贴仅在加载新关卡时更改,并且精灵一直在更改。一些图块由四个24x24片组成,大多数(但不是全部)子画面与图块大小相同。许多图块和精灵使用alpha混合。 现在,我正在即时模式下进行所有操作,这是一个坏主意。一样,当我们的一个团队成员尝试运行它时,他的帧率非常差(〜20-30 fps),而且当有更多的图块时,情况会更糟,尤其是当这些图块中的很多都是被切成碎片。所有这些使我认为问题在于进行绘制调用的次数。 我已经想到了一些可能的解决方案,但是我想让一些知道他们在说什么的人来运行它们,所以我不会在愚蠢的事情上浪费时间: 标题: 加载关卡后,将所有图块一次绘制到连接到大喇叭声纹理的帧缓冲区中,然后每帧绘制一个带有该纹理的大矩形。 加载关卡时,将所有图块放入静态顶点缓冲区中,并以这种方式绘制它们。我不知道是否有一种方法可以通过一次调用glDrawElements来绘制具有不同纹理的对象,或者这是否是我想要做的事情。也许只是将所有瓦片都变成巨大的巨型纹理,然后在VBO中使用有趣的纹理坐标? 精神: 通过单独调用glDrawElements绘制每个精灵。这似乎涉及许多纹理切换,但我被告知是不好的。纹理数组在这里可能有用吗? 以某种方式使用动态VBO。与上面的数字2相同的纹理问题。 点精灵?这可能很愚蠢。 这些想法中有什么明智的吗?我可以看的地方有很好的实现吗?
35 opengl 

10
是什么让游戏看起来“不错”?[关闭]
我正在使用OpenGL和C ++ 进行3D太空游戏,我正计划专注于为游戏提供现代的,引人注目的图形,但是我对它的思考越深,我意识到我并不真正知道什么使图形成为现实。 “好”。当然,我可以去玩一些著名的AAA游戏,并享受令人惊叹的组合图形,但是我真的不知道图形的外观如何。(这就是为什么我认为游戏是一门艺术!) 这就是我现在能想到的: 高品质的纹理 高质量型号 良好的照明模型 碰撞+镜面反射贴图 高质量的用户界面(如果适用) 大量不可逾越的后效应 我在这里问的是希望一个有经验的游戏开发人员,他制作了游戏并且知道它们的内外运作方式,可以解释一些使游戏的图形看起来“不错”的技术,以及一些不为人知的古怪技巧。那太好了。 谢谢!
34 opengl  3d  graphics 


2
在OpenGL中建立游戏循环的好方法
我目前正在学校里开始学习OpenGL,而前几天我已经开始制作一个简单的游戏(我自己,不是在学校里)。我正在使用freeglut,并使用C进行构建,因此对于我的游戏循环,我确实一直在使用传递给我的函数来glutIdleFunc一次性更新所有图形和物理特性。对于我不太在乎帧频的简单动画来说,这很好,但是由于游戏主要是基于物理的,因此我真的想(需要)确定更新速度。 因此,我的第一个尝试是让函数传递给glutIdleFunc(myIdle()),以跟踪自上次调用以来经过了多少时间,并每隔毫秒更新一次物理(以及当前的图形)。我曾经timeGetTime()这样做(通过使用<windows.h>)。这让我开始思考,使用空闲功能真的是进行游戏循环的好方法吗? 我的问题是,在OpenGL中实现游戏循环的更好方法是什么?我应该避免使用空闲功能吗?
31 opengl  c  game-loop 


9
我应该继续学习OpenGL还是只是改用DirectX,让我有更好的机会进入游戏行业?[关闭]
我已经使用OpenGL和Linux学习图形编程已有一段时间了。我对大多数概念都很熟悉,但是我真的很想加深我的知识,并最终从事游戏开发,尤其是游戏引擎开发的职业。 到目前为止,在我看来,大多数游戏工作室都使用DirectX为Windows制作游戏。 编辑:我知道之前曾有人问过OpenGL vs DirectX问题,但我没有从我想要的角度找到答案。 编辑2:阅读完所有响应/评论后,我决定继续深入研究OpenGL / GLSL的图形,但是我也会尝试使用DX,只是对API有基本的了解。我要感谢大家为您提供的答案和见解。


2
Android游戏应使用多少个线程?
至少,一个OpenGL Android游戏具有一个UI线程和一个由创建的Renderer线程GLSurfaceView。 Renderer.onDrawFrame()应该做最少的工作以获得最佳的FPS。物理,AI等不需要运行每一帧,因此我们可以将它们放在另一个线程中。现在我们有: 渲染器线程-更新动画并绘制多边形 游戏线程-逻辑与周期性物理学,AI等更新 UI线程-仅适用于Android UI交互 由于您永远不想阻塞UI线程,因此我为游戏逻辑运行了一个线程。也许那不是必需的?有没有理由在渲染器线程中运行游戏逻辑?

4
为什么可编程管线(GLSL)比固定管线更快?
因此,我正在自学GLSL,并试图弄清为什么它比固定功能管道更快。 我遇到问题的原因是,据我了解,您创建的着色器正在替换之前存在的管道部分。那么,如何简单地提供自己的版本来加快速度呢? 我唯一能想到的是,如果您以前尝试提供自己的照明方程式,则必须在CPU上进行计算,但是现在您可以在GPU上进行计算,这会更快。 我理解正确吗?
27 opengl  glsl 

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.