Questions tagged «opengl»

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

1
我如何知道内存处理不正确?
每当我加载纹理时,我的(2D)游戏的内存占用似乎都在增加,例如,当我启动游戏时,在穿越〜367mb的背景文件后,它使用30 mb的专用RAM,因此有时它全部在RAM中,它会增加到54 mb专用RAM。 在经过相同的距离但在两个点之间反复来回之后,会发生相同的事情。 但是,我的读数显示,纹理退出屏幕后大约一秒钟,该程序正确地调用了glDeleteTextures。valgrind没有发现任何泄漏。 我怎么知道我是否应该为此担心,或者这仅仅是操作系统页面存储方式的怪癖?
12 opengl  memory 

1
OpenGL绑定和实体之间的关系
这主要是一个文档问题。我希望这是一个适当的地方,而不是例如程序员或stackoverflow。 我没有阅读OpenGL规范,但是从书籍(《红皮书》)和各种教程中,我无法正确掌握API的不同对象和部分是如何交互和关联的。 例如,我知道如果绑定了VAO,则绑定VBO并设置属性将导致VBO绑定到VAO。 但是对象很多,它们之间的关系可能会有所不同。例如,VAO与当前的着色程序完全无关,但是绘制操作的结果可能取决于两者。 在所有各种OpenGL组件中,我可以看到一些诸如C绑定到B或A和B的关系。所有这些关系在确定如何改变上下文状态,如何改变事物,如何将事物保存在一起并进行优化方面是一致的。 我要寻找资源解释只是这些关系。就像UML图,图形,甚至是文本文档一样,它们不关注调用,而是以紧凑的方式描述了各种OpenGL组件如何交互以及如何相互关联。 您知道在哪里可以找到这样的资源吗?

1
最佳纹理大小是多少?
我最近在我的项目中添加了一个纹理打包器,该打包器会将一定数量的纹理打包到单个纹理中,如下所示: 因此,举例来说,这个尺寸为582x1023像素。添加这些压缩纹理的目的显然是为了提高性能,因此我想为OpenGL(使用LWJGL)纹理查找最佳纹理大小。我发现的事情,一个得到广泛支持的最大纹理尺寸似乎是1024×1024,根据此为一例。这让我感到奇怪,因为显然很多纹理本身都比这更大,那么这些发生了什么呢?我很确定大多数显卡都支持更大的纹理。我是否可以合理地期望大多数图形卡能够处理4096x4096纹理(或什至更大)? 第二点(我希望这仍然是一个问题,但本质上可以归结为同一问题):纹理的大小应设置为2的幂(256x256、512x512、1024x1024、2048x2048等),并且应该我将小于其的填充纹理填充到下一个2的幂?根据2011年的这个问题,这不是必须的,但可以提高性能并避免出现小错误,而2012年的这个问题说您绝对应该填充纹理。因此,我意识到这些问题以前曾被问过,但它们的日期合理,答案已经更改,而且它们每个都只能部分回答我的问题。其他项目/如何处理? TL; DR:大多数图形卡可以处理哪种纹理大小?最佳纹理大小是多少(或存在)?我应该将纹理宽度填充到下一个2的幂吗?

3
绕固定轴旋转对象
我试图让我的应用程序用户通过在屏幕上拖动手指来旋转在屏幕中央绘制的3D对象。屏幕上的水平移动表示绕固定的Y轴旋转,而垂直移动表示绕X轴旋转。我遇到的问题是,如果我只允许绕一个轴旋转,则对象旋转良好,但是一旦引入第二个旋转,该对象就不会按预期旋转。 这是正在发生的情况的图片: 蓝色轴代表我的固定轴。画出具有此固定蓝色轴的屏幕。这就是我要相对于对象旋转的对象。发生的是红色。 这是我所知道的: 围绕Y(0,1,0)的第一次旋转使模型从蓝色空间(称为空间A)移至另一个空间(称为空间B)。 尝试再次使用向量(1、0、0)旋转时,空间B中的x轴会旋转,而不是空间A中的x轴旋转,这不是我的意思。 考虑到我(想)知道的内容(为简洁起见,省略了W坐标),这是我尝试的操作: 首先使用四元数绕Y(0,1,0)旋转。 将旋转Y四元数转换为矩阵。 将Y旋转矩阵乘以我的固定轴x矢量(1、0、0),以获得相对于新空间的X轴。 使用四元数围绕这个新的X向量旋转。 这是代码: private float[] rotationMatrix() { final float[] xAxis = {1f, 0f, 0f, 1f}; final float[] yAxis = {0f, 1f, 0f, 1f}; float[] rotationY = Quaternion.fromAxisAngle(yAxis, -angleX).toMatrix(); // multiply x axis by rotationY to put it in object space float[] …

1
是否应该取消绑定缓冲区?
我正在使用OpenGL ES 2进行一些测试,但遇到了一些问题,我目前的程序是这样的: Init ------- -> create index buffer -> fill index buffer glBufferData … -> create vertex buffer -> fill vertex buffer glBufferData … Draw ------- 1. Apply vertex buffer -> Bind VAO -> bind vertex buffer - enable attributs (glVertexPointer, …) -> unbind vertex buffer -> Unbind VAO …

3
如何使用图形管线基于密度函数渲染体积数据?
两种图形API(OpenGL和DirectX)都设计了明确定义的管道,其中几个阶段都可以编程。这些可编程阶段需要获取固定的最小数据量,并应在其上进行明确定义的操作范围,并输出一些已定义的最小输出,以便可以将数据正确地传递到下一个阶段。似乎这些流水线被设计为仅使用有限数量的几何数据类型,对于D3D和OGL而言,它们都是顶点数据和纹理坐标。 但是,如果我打算制作的应用程序在某种情况下不使用顶点(甚至是体素)来表示其几何数据,并且不完全进行变换或投影,栅格化或插值等操作,则API的局限性否则管道会使事情变得困难。 那么,是否有一种方法可以改变图形管道,从而使每个阶段对数据执行的功能以及每个阶段输出的数据类型都对我有利?如果没有,那么有没有办法我可以使用“原始” API函数来构建自己的管道?如果没有,请说明为什么不可能。 编辑:我的应用程序使用密度函数来表示几何。该函数在空间的每个点都有一个值。我将相机的视锥台分为3d网格,每个块可以投影为一个像素。在每个块上,我集成密度函数,并检查其值是否大于要求的值。如果是,则假定该块中存在某些东西,并且渲染与该块相对应的像素。因此,现在在渲染器中,我希望将函数(用字符串表示)传递给图形硬件,而不是传递顶点缓冲区中的顶点数据。这也意味着顶点着色器将没有顶点可以转换为同质的剪贴空间,并且片段着色器不会获取像素信息。取而代之的是,现在大多数查找和评估都针对每个像素进行。

1
OpenGL-立方体上的白色边缘
在我制作的类似于《我的世界》的游戏中,我的立方体上出现白色边缘: 在深色纹理中更明显。正在按以下方式设置纹理: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 有什么帮助吗?

2
OpenGL:是否可以在不指定VBO的情况下使用VAO
在我可以找到的有关VAO(顶点数组对象)的所有教程中,它们都展示了如何通过配置顶点属性和绑定VBO(顶点缓冲区对象)来使用它们。但是我想创建一个VAO,该VAO将与一组固定着色器一起为一组VBO配置,其中每个缓冲区使用相同的数据模式(顶点,uv,颜色等)。因此,我想为将使用一个着色器绘制的多个VBO创建一个VAO。 我在此上找不到任何演示,所以我决定尝试一下。但它不起作用,并在glDrawArray通话中崩溃。似乎VBO没有绑定。这是我正在使用的代码: 渲染: /* Prepare vertex attributes */ glBindVertexArrayOES(vao); /* Upload the buffer to the GPU */ glBindBuffer(GL_ARRAY_BUFFER, pool->next()); glBufferSubData(GL_ARRAY_BUFFER, 0, parts * buffer.stride() * 6, buffer.getBuffer()); /* Draw the triangles */ glDrawArrays(GL_TRIANGLES, 0, parts * 6); glBindVertexArrayOES(0); VAO创作: glBindVertexArrayOES(vao); glEnableVertexAttribArray(ls.position); glVertexAttribPointer(ls.position, 2, GL_FLOAT, GL_FALSE, buffer.stride(), 0); glEnableVertexAttribArray(ls.color); glVertexAttribPointer(ls.color, 3, …
12 opengl  vbo  vao 

2
如何使用累积矩阵变换解决万向节锁定问题
我正在阅读Jason L. McKesson的在线“学习现代3D图形编程”书 到目前为止,我要解决万向节锁定问题以及如何使用四元数来解决它。 然而,就在这里,在四元数页面上。 问题的一部分是,我们试图将方向存储为一系列3个累积的轴向旋转。方向是方向,而不是旋转。方向当然不是一系列旋转。因此,我们需要将船舶的方向视为方向,作为特定数量。 我想这是我开始感到困惑的第一个地方,原因是因为我看不到方向和旋转之间的巨大差异。我也不明白为什么方向不能通过一系列旋转来表示... 也: 为此,首先想到的是将方向保持为矩阵。当需要修改方向时,我们只需对此矩阵进行转换,将结果存储为新的当前方向。 这意味着应用于当前方向的每个偏航,俯仰和横滚都将相对于该当前方向。正是我们所需要的。如果用户应用正偏航,则希望该偏航相对于它们当前指向的位置而不是相对于某个固定坐标系旋转它们。 我理解这个概念,但是我不理解如果累积矩阵变换可以解决此问题,那么上一页中给出的代码不仅如此。 这是代码: void display() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutil::MatrixStack currMatrix; currMatrix.Translate(glm::vec3(0.0f, 0.0f, -200.0f)); currMatrix.RotateX(g_angles.fAngleX); DrawGimbal(currMatrix, GIMBAL_X_AXIS, glm::vec4(0.4f, 0.4f, 1.0f, 1.0f)); currMatrix.RotateY(g_angles.fAngleY); DrawGimbal(currMatrix, GIMBAL_Y_AXIS, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f)); currMatrix.RotateZ(g_angles.fAngleZ); DrawGimbal(currMatrix, GIMBAL_Z_AXIS, glm::vec4(1.0f, 0.3f, 0.3f, 1.0f)); glUseProgram(theProgram); …

4
OpenGL ES 2.0中的几何实例化
我打算在OpenGL ES 2.0中进行几何体实例化。基本上,我打算在场景中渲染相同的几何体(一把椅子)大约1000次。 在OpenGL ES 2.0中执行此操作的最佳方法是什么? 我正在考虑将模型视图mat4作为属性传递。由于属性是每个顶点数据,因此我需要传递相同的mat4,因此对于同一三角形的每个顶点都要传递三遍(因为modelview在三角形的各个顶点之间保持不变)。 这将导致发送到GPU的大量额外数据(2个额外的顶点* 16个浮点*(三角形数)数量的额外数据)。 还是应该每个三角形仅发送一次mat4?但是由于属性定义为“每个顶点”数据,使用属性怎么可能呢? 在OpenGL ES 2.0中进行实例化的最佳和有效方法是什么?

4
面向对象的OpenGL
我使用OpenGL已经有一段时间了,并且阅读了大量的教程。除了它们中的许多仍在使用固定管道这一事实外,它们通常会将所有的初始化,状态更改和绘制都放在一个源文件中。对于教程的有限范围来说,这很好,但是我很难确定如何将其扩展到完整的游戏。 如何将OpenGL的使用跨文件分割?从概念上讲,我可以看到拥有一个仅将内容渲染到屏幕上的渲染类的好处,但是诸如着色器和灯光之类的东西将如何工作?我应该为灯光和着色器之类的课程设置单独的类吗?

5
有哪些GLUT替代品?
我正在尝试学习OpenGL,但我发现GLUT已过时。我已经知道SDL,而且似乎是一个不错的选择。我应该使用SDL来用OpenGL开发游戏,还是有更好的选择。我是游戏开发的新手,所以我对最新技术了解不多。
12 opengl 

5
GLUT过时了吗?
有人问了有关最新的OpenGL资源的问题,答案之一是指向有关现代OpenGL编程的教程的链接。 有问题的教程使用了GLUT和GLEW,但是我在某处读到了GLUT已过时。真的吗?
12 opengl  glut 

2
我可以将Minecraft克隆设为开源吗?
我在业余时间开发Minecraft之类的游戏。事实上,这不是“ 喜欢我的世界”,因为我想使它成为一个接近的,可以复制(意为锻炼我自己在16岁的时候,只是因为它是有趣的我)。当然,我不是使用Minecraft Coder Pack(MCP)复制代码。我使用OpenGL在Java中从头开始游戏。 因此,我的问题是:是否可以将我的源代码在线存储在GitHub,Google Code等公共源代码版本控制主机上(这使我的代码开源,因为我不想支付使用私有代码的费用)主办)?当然,我不想出售该游戏,因为该游戏来自Notch。 可能很重要的一个细节是,我正在使用自定义纹理包(因此,不是真正的Minecraft附带的那个)。 如果允许,是否有任何规则?我看了一下这个页面,但似乎他对此没有说什么:http : //www.minecraft.net/terms 编辑:有一个来自Begla的名为Terasology(以Blockmania命名的游戏)的游戏。这是一个不错的项目,但它并不意味着它与Minecraft尽可能接近。该项目是开源的。

2
Halo如何吸引弹丸?
我正在尝试绘制弹丸并做广告牌。弹丸由布满告示牌的“粒子”和“示踪剂”组成。当我在弹丸上做广告牌时,玩家的观看方向平行于弹丸轴时,看不到它。 Halo或其他游戏如何解决此问题,以便可以从后面看到弹丸。

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.