问题标签 [opengl-4]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - 在 OSX 上加载 OpenGL 4.1 上下文
我正在尝试在 OSX Mavericks 上学习 OpenGL,它支持到今天为止的 OpenGL 4.1。
我保持基本并使用 gcc (g++) 进行编译,但是当通过 Freeglut OSX 加载开放 GL 上下文时会加载旧版 OpenGL 配置文件。
我试过这个:OpenGL 3.3 on OSX with FreeGLUT但没有运气,glGetString 调用返回这些值:
有人有想法么?
我正在使用以下上下文调用调用 FreeGlut:
编辑:刚刚在 Windows 而不是 OSX 中尝试了相同的应用程序并得到了这个错误:
2.1 上下文请求但 wglCreateContextAttribsARB 不可用。回退到遗留上下文创建
这是我的应用程序入口点
好的 所以...
在 Windows PC 上重新编译,没有问题,可能是 OSX 或 OSX 本身或组合上的 FreeGLUT 的问题。
至少现在我有代码可以用来测试 OSX...
opengl - glDrawArraysInstanced 的性能问题
我正在尝试实现一个 OpenGL4 实例化绘图算法,其中每个实例都由一个三角形组成。我要实现这种算法的主要原因是:
- 在基于每个三角形而不是基于每个顶点给出颜色的频繁场景中使用更少 GPU 内存的能力
- 在不使用几何着色器的情况下执行每个三角形计算的能力,从我的实验来看,这大大减慢了整个管道
我的渲染程序由一个顶点着色器和一个片段着色器组成。顶点着色器如下:
片段着色器是这个:
如您所见,在我的顶点着色器中,我为顶点位置声明了三个顶点属性,为颜色声明了三个顶点属性。所有这些属性都被实例化,并且它们的除数设置为 1。
我之所以拥有三个颜色属性,是因为有时我希望能够为三个三角形顶点设置不同的颜色,而更常见的情况是,我为整个三角形设置一个颜色。在最后一个场景中,我只是将三个颜色属性附加到相同的 VBO,指定相同的步幅和偏移量。
我编写了一个测试应用程序,它绘制了一个四边形矩阵,每个四边形由两个三角形组成。这是我用来初始化顶点数据的代码:
如您所见,我对位置使用单个 VBO,但每个位置属性都使用不同的偏移量连接到 VBO。
对于颜色,我使用单个 VBO,并且所有颜色属性都使用相同的步幅和偏移量连接(从而实现每个三角形的颜色而不是每个顶点的颜色)。
渲染循环如下:
我在集成的 Intel HD 4400 卡和 Nvidia GeForce GT 750M 卡上测试了该应用程序。令人惊讶的是,英特尔显卡的性能比英伟达显卡好得多。以下是一些 fps 统计数据:
800000 个三角形:
- 英特尔:140 帧/秒
- 英伟达:31fps
1600000 个三角形:
- 英特尔:74 帧/秒
- 英伟达:16 fps
有人对如何提高 Nvidia 卡的性能有任何建议吗?你认为将 TBO 用于位置和颜色会给我带来性能提升吗?
更新:
为了更好地理解这个问题,我使用 GPUView 在 windows 下分析了应用程序。我注意到英特尔和英伟达之间的行为完全不同。
英特尔每帧生成一个大 DMA 数据包 (8 kB),执行速度非常快。相反,Nvidia 在每帧生成大量的小数据包(4-8 字节)并排队,因此,它们必须等待很长时间才能被执行。
这些信息让我想知道这是否可能是 Nvidia 驱动程序错误。你认为这可能吗?
opengl - 哪个着色器阶段必须写 gl_ClipDistance[x]
除了片段着色器,它在所有着色器中都可用作输出变量。那么哪个shader stage必须写呢?它的值是否取自编写它的最后一个着色器阶段?
还请解释在片段着色器中具有值 gl_ClipDistance 的目的是什么?
opengl - opengl 4.3计算着色器不将值写入缓冲区
我在计算着色器方面遇到了一个奇怪的问题,因为我更改了传递给着色器的缓冲区的结构大小。
像这样定义的。我在尝试使用扁平 id 时遇到问题,所以我想将 id 写回我传入的缓冲区。着色器看起来像这样。
所以到目前为止一切都很好,但是当我取消注释最后一行是particleBuffer.particles [4]的那一刻,网格从屏幕上消失了。我之前已经设法改变了这个网格的位置数据,但这看起来很奇怪。我验证了我确实有 16 个我要传入的缓冲区元素,因此它也不应该超出范围(即,cloth1.particles.size() = 16)。有任何想法吗 ??整个代码在这里.. https://github.com/ssarangi/OpenGL_Cloth/tree/master/cloth_4_3_compute
***********************已编辑安东的评论*********************** ******* 这是 C++ 方面的新布局。
GLSL 端定义。我不确定的是填充元素是否需要包含在 glsl 结构中。它仍然没有更新ID。
c++ - 在 OpenGL 4.0 中是否有围绕局部坐标(即从模型视图矩阵)旋转的标准方法?
我一直在研究游戏引擎,最近到了可以轻松创建 Camera 类来管理视图矩阵(或允许轻松切换到另一个)的地步。我从概念上知道它必须做什么,但是我遇到的麻烦是弄清楚如何围绕本地原点旋转(对于视图矩阵,它与乘以旋转矩阵的平移矩阵相同)。
我知道在直接模式下,你会
但我不确定这将如何转化为更现代的应用程序。你会做同样的事情,让一个平移矩阵回到原点,旋转,然后平移回来吗?对于您要旋转的每个对象?从我目前测试的结果来看,该方法适用于查看,但在 3D 空间中控制它很笨拙(我不确定如何不断调整旋转。将运动组件转换为单个 vec4,乘以旋转,应用于翻译,然后进行实际旋转?)
似乎有一种比我缺少的三个或更多 4x4 矩阵乘法更有效的方法。
这是尝试建议的解决方案后的特定部分。
c++ - glMultiDrawElements间接使用
好的,所以我正在尝试编写一个简单的渲染循环来理解glMultiDrawElementsIndirect
. 但目前它冻结了我的整个计算机(Ubuntu 14.04)并迫使我冷启动它。
我将这个结构定义为 OpenGL 规范的指导:
那么目前我的理解是这样的(在伪代码中):
然后在我的绘图循环中:
这完全冻结了我的电脑 D:我真的不认为我理解 的正确用法glMultiDrawElementsIndirect
,正确的方法是什么?我怎么能像现在这样做?我想将所有网格加载到一个块中。
c++ - 具有细分的渲染多边形计数
我想知道当硬件镶嵌打开时是否有办法获得渲染到窗口的有效多边形(或顶点)的数量。由于自适应细分,多边形数量从一帧到下一帧发生变化。
我正在使用 OpenGL 4.2 并渲染调用 glDrawElements 的网格。我正在使用完整的程序着色器(顶点、镶嵌控制、镶嵌评估、几何和片段)。
我有一个数组中的初始多边形数量,但是在执行镶嵌阶段之后,这个数字不再有效。
我尝试使用 glGetQuery(GL_PRIMITIVES_GENERATED) 但它总是返回 0。
c++ - GLSL 统一访问导致程序出现错误
我有一个设置了延迟渲染的程序。我正在删除我的位置纹理以支持从深度重建位置。我之前没有遇到任何问题,但现在由于某种原因,我在尝试访问通过制服传入的矩阵时遇到了段错误!
我的片段着色器(顶点着色器无关):
如您所见,导致此段错误的代码显示在reconstruct_pos()
函数中。
为什么这会导致段错误?我已经检查了应用程序中的数据,它是正确的。
编辑:
我用来更新我的矩阵制服的代码:
glsl - 单阶段(片段着色器)、单通道场景中的 GLSL 相干图像缓冲区访问
我有一个片段着色器,它使用图像加载/存储操作对 imageBuffer 执行处理。我只关心以下情况:
- 我有一个片段着色器(没有多阶段(例如顶点然后片段着色器)考虑因素,也没有多通道渲染)
- imageBuffer 变量被声明为一致的。只对连贯的 imageBuffers 感兴趣。
为了清楚起见,我的情况如下:
我主要查看了规范
尤其是这一段:
“使用声明为“连贯”的变量可以保证存储的结果将立即对使用类似声明的变量的着色器调用可见;调用 MemoryBarrier 是为了确保存储对其他操作可见。”
注意:我的“连贯统一的 imageBuffer 数据;” 声明正是一个“类似声明”的变量。我的场景是单通道、单阶段(片段着色器)。
现在,我查看了各种网站并偶然发现(就像我认为的大多数人一样)stackoverflow.com 上的这个线程:
GPU驱动程序如何解释GLSL的“连贯”内存限定符以进行多遍渲染?
更具体地说,本段:
“你的着色器甚至不能假设在存储之后立即发出负载将获得刚刚存储在这个着色器中的内存(是的,真的。你必须放入一个 memoryBarrier 才能将它拉下来)。”
我的问题如下:
使用指定的连贯限定符,在我的单着色器、单通道处理场景中,我是否可以确定 imageStore() 将立即对我的片段着色器的所有调用可见(例如,当前调用也是如此)与其他并发调用一样)?
通过阅读 ARB_shader_image_load_store 规范,在我看来:
- 这个问题的答案是肯定的,
- 我不需要任何类型的 memoryBarrier(),
- stackoverflow 中上述引用的线程中引用的句子可能确实具有误导性和错误性。
感谢您的洞察力。
opengl - gl_PrimitiveID 在镶嵌控制和评估着色器中是如何解释的?
OpenGL 规范。说:
该变量
gl_PrimitiveID
由生成输入顶点的绘图命令处理的图元数填充。由绘图命令生成的第一个图元编号为零,处理完每个单独的点、线或三角形图元后,图元 ID 计数器就会递增。使用原始重启索引重新启动原始拓扑对原始 ID 计数器没有影响。
不幸的是,我不太明白这一点。
GL_PATCHES
如果我使用顶点数 = 32进行绘图调用,是否所有32个顶点在 Tesselation Control 着色器中都gl_PrimitiveID
= 0 ?
Tessellation Control 着色器仍会输出一个 Patch,而一个 Patch 是单个图元。
假设当这个补丁在 Tessellation Evaluation 着色器中被细分为三角形时,每个第 n个顶点都有它的gl_PrimitiveID
= n / 3是否正确?
如果不是,请解释他们的价值观是什么。