Questions tagged «opengl»

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

6
规范视图体积的目的是什么?
我目前正在学习OpenGL,但无法找到该问题的答案。 在将投影矩阵应用于视图空间之后,将视图空间“规格化”,以使所有点都位于[-1,1]范围内。通常将其称为“规范视图体积”或“标准化设备坐标”。 虽然我找到了很多资源,告诉我这是如何发生的,我还没有看到任何东西,为什么它发生。 此步骤的目的是什么?

1
我如何知道正在使用多少视频卡内存?
我想以编程方式在运行时确定程序正在使用多少视频卡内存。具体来说,我想知道如何在使用OpenGL的Windows机器上执行此操作,但也对在其他平台上执行此操作的方法感兴趣。 我知道有一些实用程序可以向我显示程序运行时的内存使用情况,但是我希望能够从我的代码中查询该信息。
15 opengl  c++  windows  c 

4
如何加载球形行星及其区域?
我正在设计一个部分由行星探索组成的游戏。我想为它们使用伪随机生成,当我不得不加载它们而不是存储每个细节的时候,从定义的种子重新生成,这会太繁琐。因此,我将随机种子和玩家所做的修改(如果有)存储在文件中。 玩家必须能够从轨道上看到行星(细节水平非常低,然后下降到地面,缓慢增加他/她着陆区域的细节水平,并从另一侧卸下超出玩家视野的行星。 如果必须在平坦的地面上进行操作,则可以使用正方形块系统轻松进行操作。但是这里的问题是行星几乎是球体。 那么,在精确点附近加载地面细节(起伏和接地物体)的最佳方法是什么? 我虽然已经提出了两种解决方案,但是两者都有一个弱点: 1.将球切成正方形块。 一旦玩家离地面足够近,我只需要从他/她的位置改善最接近的正方形的细节即可。 如果这还不够,当玩家在地面上或真的离地面很近时,我仍然可以在子正方形中切割每个正方形以进行加载。 但是,正如您在图片上看到的那样,如果玩家尝试着陆,那将是一个问题:正方形变成非常细长的矩形,甚至最后一行都变成三角形,此外还要加载很多东西,一代似乎会扭曲。 2.从二十面体开始。 在这里,我可以在玩家靠近时增加围绕他的位置的三角形镶嵌。 但是我不知道如何将三角形定位成比玩家的位置更近。我听说笛卡尔坐标在这种情况下可能有用,但我不知道如何使用它们。 我正在使用C ++ / OpenGL,所以这里要生成和加载的主要是表示表面浮雕和颜色/纹理的顶点。

1
多次下采样有好处吗?
所以我遇到了这个站点,您可以在第一和第二段中看到以下几行: 为了获得粗略而简单的效果,请将场景的明亮部分(例如光源)绘制到FBO中,然后使用GL_LINEAR缩小几次对其进行下采样。对于最终渲染,只需将原始场景与降采样的FBO结合即可。 在下面的示例中,原始场景为128 x 128,并被下采样3次。这需要4个framebuffer对象。原始场景显示在左上方,最终渲染显示在右上方。 有什么原因我应该多次降采样(128-> 64-> 32-> 16)而不是一次降采样(128-> 16)? 如果您向下滚动更多,他们甚至将其下采样9次。(128-> ...-> 16-> 128-> ...-> 16->依此类推)。为什么不这样做(128-> 16-> 128-> 16->等等)?
14 opengl  graphics  bloom 

2
较大的顶点缓冲区与多个绘制调用
我刚刚开始使用OpenGL,并且尝试使用它来创建2D游戏。在这个游戏中,我有一个六角形网格,由许多不同颜色的六角形组成。作为新手OpenGL程序员,我看到了绘制此网格的两种方法: 将顶点缓冲区与单个六边形的数据一起使用,然后使用统一的偏移值并在CPU上迭代多次以绘制同一程序,直到获得网格为止。 创建一个单一的非常大的预先计算的顶点缓冲区,该缓冲区在一次调用中绘制所有六边形。 什么是最有效的方法?有更好的方法吗?
14 opengl  shaders 

1
使用GLSL 330版实现Skybox
我正在尝试让Skybox使用OpenGL 3.3和GLSL 330版。 我在网络上的任何地方都找不到完整的现代OGL skybox教程,因此我对一个较旧的版本进行了现代化(使用glVertexAttribPointer()而不是gl_Vertex用于顶点等)。它主要在工作,但是有两个主要细节: 天空盒更像天空三角形,纹理严重扭曲和拉伸(它们应该是星场,我在黑色背景上看到线条)。我99%确信这是因为我没有完全正确移植旧教程。 这是我的Skybox类: static ShaderProgram* cubeMapShader = nullptr; static const GLfloat vertices[] = { 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, …
14 c++  opengl  glsl  cubemap  skybox 

2
GLSL着色器-更改色相/饱和度/亮度
我正在尝试使用GLSL片段着色器更改图像的色调。我想实现类似于Photoshop的“色相/饱和度调整”层的功能。 在下图中,您可以看到到目前为止我得到了什么。我想更改绿色正方形的色相,使其看起来像右边的红色正方形,但是使用此着色器,我得到一个半红色的半粉红色正方形(中间的正方形)。 我在片段着色器中所做的就是将纹理的颜色转换为HSV,然后将从顶点着色器获得的HSV颜色添加到其中,然后将颜色转换回RGB。 我究竟做错了什么? 片段着色器: precision mediump float; varying vec2 vTextureCoord; varying vec3 vHSV; uniform sampler2D sTexture; vec3 convertRGBtoHSV(vec3 rgbColor) { float r = rgbColor[0]; float g = rgbColor[1]; float b = rgbColor[2]; float colorMax = max(max(r,g), b); float colorMin = min(min(r,g), b); float delta = colorMax - colorMin; float …

1
栅格上的正交单位转换不匹配(例如64像素转换不正确)
我正在寻找一些有关网格上单位翻译的小问题的见解。 更新并解决 我解决了自己的问题。有关详情,请参见下文。帖子的这一部分中的所有内容都证明是正确的。如果有的话,它可以作为下一个人的微型教程/示例/帮助。 设定 FBO,VAO,VBO 512x448窗口 64x64格 gl_Position = projection * world * position; projection由定义。ortho(-w/2.0f, w/2.0f, -h/2.0f, h/2.0f);这是一本教科书正交投影函数。 world 由摄像机在(0,0)的固定位置定义 position 由子画面的位置定义。 问题 在下面的屏幕截图(1:1缩放)中,网格间距为64x64,我在(64,64)处绘制了单位,但是该单位在错误的位置绘制了大约10px。我尝试过使用统一的窗口尺寸来防止像素大小出现任何失真,但是现在我在提供1:1像素到世界单位的投影时失去了正确的方式。无论如何,这里有一些有助于解决问题的快速图像。 我决定在什么引擎认为是64个偏移超级强加一堆精灵。 当这似乎过的地方,我去约,做了1个单位的基本情况。似乎按预期排列。黄色显示移动差异为1px。 我想要的是 理想情况下,在任何方向上移动64个单位将输出以下内容(叠加的单位): 顶点 看来进入顶点着色器的顶点是正确的。例如,参考第一个图像,数据在VBO中如下所示: x y x y ---------------------------- tl | 0.0 24.0 64.0 24.0 bl | 0.0 0.0 -> 64.0 0.0 tr | …


3
如何实现基于四元数的相机?
更新这里的错误是一个非常简单的错误。我错过了弧度到度的转换。如果您还有其他问题,则无需阅读全文。 我看了几本关于此的教程,当我以为自己理解时,便尝试实现基于四元数的相机。问题是,旋转大约10分钟后,它无法正常工作。10度会跳回-10度。我不知道怎么了 我正在使用openTK,它已经有一个四元数类。我是opengl的菜鸟,我只是出于娱乐目的而做,并不真正了解四元数,所以我可能在这里做一些愚蠢的事情。这是一些代码:(实际上,除了加载和绘制vbo的方法外,几乎所有代码(它取自于演示vbo-s的OpenTK示例)) 我将多维数据集加载到vbo中并初始化相机的四元数 protected override void OnLoad(EventArgs e) { base.OnLoad(e); cameraPos = new Vector3(0, 0, 7); cameraRot = Quaternion.FromAxisAngle(new Vector3(0,0,-1), 0); GL.ClearColor(System.Drawing.Color.MidnightBlue); GL.Enable(EnableCap.DepthTest); vbo = LoadVBO(CubeVertices, CubeElements); } 我在这里加载透视投影。每次我调整窗口大小时,它都会在开始时加载。 protected override void OnResize(EventArgs e) { base.OnResize(e); GL.Viewport(0, 0, Width, Height); float aspect_ratio = Width / (float)Height; Matrix4 perpective = …

2
何时使用顶点数组以及何时使用VBO?
我正在尝试了解顶点数组和顶点缓冲区对象,但是我不了解以下方面的差异: 使用情况(例如地形等静态几何体,每一个帧都在变化的几何体,例如粒子系统等) 性能 便携性(旧显卡,控制台,Android或iPhone等设备等) 一些澄清?
14 opengl 


2
尽管使用了Time.deltaTime,但移动似乎与帧速率有关。
我有以下代码来计算在Unity中移动游戏对象所需的转换LateUpdate。据我了解,我对的使用Time.deltaTime应使最终的翻译帧速率独立(请注意CollisionDetection.Move(),仅用于进行射线广播)。 public IMovementModel Move(IMovementModel model) { this.model = model; targetSpeed = (model.HorizontalInput + model.VerticalInput) * model.Speed; model.CurrentSpeed = accelerateSpeed(model.CurrentSpeed, targetSpeed, model.Accel); if (model.IsJumping) { model.AmountToMove = new Vector3(model.AmountToMove.x, model.AmountToMove.y); } else if (CollisionDetection.OnGround) { model.AmountToMove = new Vector3(model.AmountToMove.x, 0); } model.FlipAnim = flipAnimation(targetSpeed); // If we're ignoring gravity, then just …

5
每秒设置帧上限有什么好处?(如果有)
我正在使用OpenGL开发一个简单的游戏,使用SDL进行显示初始化和输入,从时间的角度来看,我有两个选择。当以秒为单位的optimableTimePerFrame = 1 / theFramerateCap时,排名第一的仅是为optimizeTimePerFrame休眠的-theTimeTakenToRender。(我不完全确定这是否必要,因为这等效于使用vsync,这可能更准确。如果我的假设正确,请告诉我SDL + OpenGL是否默认具有vsync,如果没有,另一种方法是测量自渲染最后一帧以来的时间,并仅相应地调整运动。(渲染框架所花费的时间越短,实体在该框架中移动的距离越少)。在性能,减少闪烁等方面,这两种方法的优缺点是什么?
13 opengl  sdl  frame-rate  vsync 

1
如何减小图像尺寸而无像素化?
我看到很多游戏都具有平滑的边缘字符和高分辨率图像,但是当我尝试将图像缩小为我的角色说64x64时,我只会遇到像素混乱。即使从64x64画布开始,我也会得到像素化的边缘。 我应该使用OpenGL缩放吗?还是我不知道的某些与photoshop或pixen有关的技术?

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.