Questions tagged «opengl»

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

2
如何将GLFW的键盘输入转发到另一个对象?
我在尝试使用GLFW3在另一个类中执行键盘事件时遇到麻烦。我遇到的问题是GLFW3使用静态函数进行输入,如下所示: static UI u; ... ... static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { u.controls(window, key, action); } u也是静态的,控件保留WSAD键的输入(这是我获取键事件的唯一方法)。从这里开始,按下一个键将显示在控制台窗口中按下哪个键。我遇到的麻烦是试图使用按下的键来操纵另一个类中的变量。 我还有一个名为MainMenu的类,该类具有该功能。update().是否可以在此函数中使用UI类?
9 opengl  c++  keyboard  glfw 

1
3D相机旋转
拜托,请原谅我,但我需要帮助,而我在这个问题上已经停留了几个星期,我没有取得任何进展,无论我走到哪里,我都会看到一个不同的答案,我尝试的所有方法都无法正常工作。我已经有了足够的技巧和建议,现在我真的只需要一个人给我答案,我就可以从此倒退,因为我不明白这一点。 使该主题最令人困惑的是每个人使用一组不同的约定或规则的方式,他们的答案基于他们自己的约定而没有定义它们的含义。 因此,这是我根据似乎最常见和合乎逻辑的内容形成的一组约定: 轴的右手法则。 正Y向上,正Z朝向观看者,正X朝向右侧。 行主矩阵,发送到着色器时转置。 螺距:绕X轴旋转 偏航:绕y轴旋转 滚动:绕z轴旋转 轮换顺序:横摇,俯仰,偏航(这是正确的吗?有人可以对此进行检查吗?) 从轴的正端向下看,正旋转值会导致顺时针旋转。 沿所有轴旋转0的默认方向是向下指向负Y的向量。 ..鉴于这些约定(如果它们约定不对,请务必纠正我!),如何做: 写一个LookAt函数?(lookAt(矢量位置,矢量眼焦点,矢量向上)) 计算旋转矩阵。(旋转(x,y,z)) 至少在过去的3周内,我尝试自己回答了这两个问题,我至少重写了LookAt&Rotation Matrix函数30次,测试了数十种方法,并通读了我所见过的材料。数百个网站,阅读了许多回答的问题,复制了别人的代码,到目前为止,我所做的一切都没有奏效,所有事情都产生了错误的结果。其中一些产生了一些非常怪异的输出,甚至没有接近正确的旋转。 除昨晚外,我每天晚上都在为此工作,因为我对反复的失败感到非常沮丧,不得不停下来休息一下。 拜托,请告诉我正确的方法是什么,以便我可以逆向工作并弄清楚它是如何工作的,我只是没有得到正确的答案,这使我有些疯狂! 我正在用Java编写,但是我会接受用任何语言编写的代码,我的大多数3D渲染代码实际上都运行得非常出色,这只是我无法理解的数学。 更新:已解决 感谢您的帮助!现在,我有了一个我真正理解的可以正常工作的LookAt函数,而且我再也高兴不起来了(如果有人想问一下,请问)。 我确实曾尝试过根据俯仰/偏航/侧倾变量创建旋转矩阵,但它似乎还是失败了,但是我决定放弃尝试将euler角用于freelook相机,因为它似乎不适合用于角色,而不是我要创建一个四元数类,沿着这条路径走运可能会更好,否则,我将诉诸于使用螺距/偏航作为球面坐标,并依靠新的工作LookAt函数进行旋转。 如果还有其他人遇到类似的问题并想问我问题,请随时。 至少我不会再受困了,谢谢您的帮助!

3
如何将多个矩阵发送到顶点着色器?
我正在使用骨骼/蒙皮练习动画。我正在尝试为着色器每个顶点发送一个矩阵。我可以想到这两种方法。 方法一 这样的每个骨基质都有一个统一的手柄 u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]"); u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]"); 并在其中onDraw将它们每个发送到着色器: GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0); 如果我有大量矩阵,显然这不是一个好方法。我的第二个想法我还没有尝试过,因为有很多代码可以重构 方法2 是用来glUniformMatrix4fv一次将它们全部发送出去(假设我有20个矩阵) GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0); 哪里matrices是float[16 * 20]。但是,然后修改每个骨骼的矩阵变得有点乏味。例如,如果我想获得第3个矩阵,则需要 float[] _3rd = Arrays.copy(matrices, 3*16, 4*16); 而保存这些值可能会变得更加烦人。 我现在正在使用方法1,但看起来并不十分聪明... 将多个矩阵发送到OpenGL ES 2着色器的最佳方法是什么? LE:我正在使用Android,因此我正在寻找Java解决方案。

3
OpenGL实际上需要多长时间来更新屏幕?
我在C中有一个简单的OpenGL测试应用程序,它根据按键输入绘制不同的内容。(Mesa 8.0.4,在配备NVIDIA GTX650的PC上与Mesa-EGL和GLFW,Ubuntu 12.04LTS一起尝试过)。绘制非常简单/快速(旋转三角形类型的东西)。我的测试代码没有以任何方式故意限制帧速率,它看起来像这样: while (true) { draw(); swap_buffers(); } 我对此进行了非常仔细的计时,发现从一个eglSwapBuffers()(或glfwSwapBuffers相同的东西)调用到下一个调用的时间约为16.6毫秒。eglSwapBuffers()即使画出的内容非常简单,从通话后到下次通话前的时间也仅比该时间少一点。交换缓冲区调用花费的时间不到1ms。 但是,从应用程序响应按键更改其绘画到实际在屏幕上显示更改的时间> 150ms(价值约8-9帧)。这是通过以60fps的屏幕和键盘的摄像机记录来测量的。 因此,问题是: 在调用交换缓冲区与实际显示在屏幕之间的绘制在哪里缓冲?为什么要延迟?看起来该应用始终都在屏幕前绘制许多帧。 OpenGL应用程序可以做什么以立即绘制屏幕?(即:无缓冲,仅阻塞直到绘制完成;我不需要高吞吐量,我需要低延迟) 应用程序可以做些什么来使上述立即抽奖尽快发生? 应用程序如何知道当前屏幕上实际显示的内容?(或者,当前缓冲延迟是几帧/几帧?)


1
如何在2D游戏中使用现代OpenGL?
我已经找到了很多有关3D的“现代” OpenGL(3.0+)教程,但是在寻找有关如何将其用于2D游戏开发的信息时,却几乎找不到。如何开始将OpenGL用于2D gamedev? 具体来说,我对获取以下主题的答案感兴趣: 我应该如何为正交投影设置各种矩阵? 着色器在2D应用程序中使用的程度与在3D应用程序中一样吗?如果是这样,它们在2D设置中的目的是什么? 我应该如何处理2D游戏显然需要的大量纹理? 对于这个相对广泛的问题,我深表歉意,但是我花了很长时间进行搜索,但发现很少有适用于现代OpenGL的有用信息。
9 opengl  2d 

1
使用mipmap的纹理坐标不连续性会创建接缝
我刚刚开始学习openGL,并且在使用mipmap对球体进行纹理化时得到了此工件。基本上,当片段对我的纹理的边缘进行采样时,它会检测不连续性(例如从1到0)并选择最小的mipmap,从而创建此丑陋的接缝: 丑陋的缝http://cdn.imghack.se/images/6bbe0ad0173cac003cd5dddc94bd43c7.png 因此,我尝试使用textureGrad手动覆盖渐变: //fragVert is the original vertex from the vertex shader vec2 ll = vec2((atan(fragVert.y, fragVert.x) / 3.1415926 + 1.0) * 0.5, (asin(fragVert.z) / 3.1415926 + 0.5)); vec2 ll2 = ll; if (ll.x < 0.01 || ll.x > 0.99) ll2.x = .5; vec4 surfaceColor = textureGrad(material.tex, ll, dFdx(ll2), dFdy(ll2)); …

1
2D水顶面轮廓
我正在尝试使用顶点片段着色器创建水表面厚度的效果。 我在3D游戏环境中,但是它是滚动视图,所以是“ 2D”视图。 这是一个使用片段着色器在真实2D中创建这种效果的很好的教程。 但是我认为这不能用于我的情况。目前,我只有一架飞机要折射。 我想应用水厚效果。但是我不知道该怎么做。 我暂时不尝试使用顶点创建一些水变形/位移,这不是重点。 我不知道是否可以使用简单的四边形,也许我应该使用这样的对象。 这里有些例子。 我对如何产生这种效果一无所知。 非常感谢 ! [ 编辑 ]添加了雷曼水效果以更好地参考效果。

1
GPU与CPU上的网格处理
只是有点好奇-您在CPU或着色器中的哪里执行网格处理?我一直在做CPU上的所有事情,一位朋友建议将其移至GPU端。 如果您在GPU上执行骨骼动画之类的操作,如何获得网格?(因为我正在进行碰撞检测...)
9 opengl  3d 

1
gluLookAt如何工作?
据我了解, gluLookAt( eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x, up_y, up_z ); 等效于: glRotatef(B, 0.0, 0.0, 1.0); glRotatef(A, wx, wy, wz); glTranslatef(-eye_x, -eye_y, -eye_z); 但是当我打印出ModelView矩阵时,对的调用glTranslatef()似乎无法正常工作。这是代码片段: #include <stdlib.h> #include <stdio.h> #include <GL/glut.h> #include <iomanip> #include <iostream> #include <string> using namespace std; static const int Rx = 0; static const int Ry …

2
我是否需要担心现实场景中基于四边形的渲染?
大多数时候,在有关光栅化和渲染技术的随机书籍的第一章中,我会找到一些有关基于三角形的渲染系统和基于四边形的渲染系统的短语。 我从未遇到过基于四核的GPU或管线。在处理OpenGL 3.0+时,我是否需要担心这一点,还是仅仅是传统的东西?
9 opengl  gpu 


4
可变长度循环对GPU着色器的影响
它很流行在GPU内渲染程序内容,例如在演示场景中(绘制单个四边形以填充屏幕并让GPU计算像素)。 雷行军很受欢迎: 这意味着GPU正在每个像素执行一些未知数量的循环迭代(尽管您可以将上限设为maxIterations)。 具有可变长度的循环如何影响着色器性能? 想象一下简单的光线行进伪代码: t = 0.f; while(t < maxDist) { p = rayStart + rayDir * t; d = DistanceFunc(p); t += d; if(d < epsilon) { ... emit p return; } } 各种主流GPU系列(Nvidia,ATI,PowerVR,Mali,Intel等)如何受到影响?顶点着色器,尤其是片段着色器? 如何进行优化?

3
第一次阴影贴图问题
我第一次使用着色器在OpenGL中实现了基本的阴影映射,现在遇到了一些问题。在下面,您可以看到我渲染的场景的示例: 我要进行的阴影映射的过程是,我使用“视图矩阵”从光的角度以及用于正常渲染的投影和模型矩阵将场景渲染到帧缓冲区。 在第二遍中,我将上述MVP矩阵从光的角度发送到顶点着色器,该顶点着色器将位置转换为光空间。片段着色器进行透视划分,并将位置更改为纹理坐标。 这是我的顶点着色器, #version 150 core uniform mat4 ModelViewMatrix; uniform mat3 NormalMatrix; uniform mat4 MVPMatrix; uniform mat4 lightMVP; uniform float scale; in vec3 in_Position; in vec3 in_Normal; in vec2 in_TexCoord; smooth out vec3 pass_Normal; smooth out vec3 pass_Position; smooth out vec2 TexCoord; smooth out vec4 lightspace_Position; void main(void){ pass_Normal …

2
处理场景中的许多灯光(带有着色器)
我很好奇如何处理场景中的许多灯光。给定角色扮演游戏中非常大的地图,其中包括地牢(其中有灯光)等。我知道延迟照明,但这只能回答如何渲染许多灯光。但是我的问题更多:如何不渲染很多灯光。仅渲染影响场景的灯光显然是可取的,但是我不知道将其存档的技术/算法。没有人希望甚至能够渲染500个点光源,仅仅是因为地图上的某个地方。但是,人们不能只是从灯光到玩家的直线,并测试两者之间是否有直线。距离似乎也不是一个好的指标。(阳光?) tl; dr:如何找出仅影响渲染的灯光会影响场景?

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.