问题标签 [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.

0 投票
11 回答
18049 浏览

opengl - OpenGL 4.x 学习资源

我知道有一些关于学习 OpenGL 的问题。这是我所知道的:

  • 3D数学
  • 3D理论

这是我想知道的: - OpenGL 4.0核心配置文件(或更高版本) - 着色器语言 400(或后者) - 上面的每个部分(如果它不适用于供应商,那么它仍然不会打扰我)

这是我不想知道的 - 固定功能管道(永远不会使用它!) - 较旧的 OpenGL - 兼容性配置文件

我更喜欢更多的信息,比如教程、系列文章、书籍。

PS 如果您知道有关 opengl 3.x 核心配置文件的资源,请也发布它们

0 投票
3 回答
2499 浏览

opengl - 现代 OpenGL 着色器应该如何编写才能相互兼容?

在花哨的 OpenGL 新版本(3.0 和 4.0 以上)中,不推荐使用 gl_Vertex 等内置顶点属性。实际渲染任何东西的“新方法”是为位置、颜色等指定您自己的顶点属性,然后将这些自定义属性绑定到缓冲区。

我的问题是:如何在不紧密耦合渲染代码和着色器的情况下做到这一点?如果我编写一个使用“位置”作为顶点位置的着色器,则使用着色器的主机代码必须知道这一点并将顶点数据作为“位置”传递。如果我想使用一个不同的着色器来获取“vertex_pos”中的顶点数据,我必须先重写该着色器,或者修改我的主机代码以将顶点数据作为“vertex_pos”发送。

是否有一组所有着色器都应该使用的标准顶点和片段属性的最佳实践名称?或者是否存在特定于引擎的巴尔干化标准,这样为一个引擎编写的着色器在不修改的情况下无法在另一个引擎上工作?还是根本没有标准,这样,通常每个对象都需要自己的自定义渲染代码来匹配其自定义着色器?

0 投票
1 回答
19332 浏览

opengl - OpenGL 4.1 和 3.1+,主要区别是什么?

我知道 OpenGL 4 和 3 非常相似,尤其是 3.1 和 4.1。由于两者基本上是一起发布的,因此很难理解 OpenGL 4.0/4.1 的基本原理。

在以前的 OpenGL 版本中,次要版本会向上递增,直到大量更改累积到新的主要版本中。OpenGL 3.x 和 4.x 引入了向后不兼容的 API 更改,然后 OpenGL 3.2 和 3.3 被称为 3 系列的特定分支,它们不向前兼容,而 3.1 与 4.1+ 兼容

与 OpenGL 3.1 相比,OpenGL 4.1 提供了哪些关键差异,从而保证它被归类为新的主要版本?

奖励:是否有任何差异在 GL3 或仅可访问性的任何情况下提供了性能提升?

编辑:基于答案的一些额外发现


OpenGL 3.3 是对 OpenGL 4.0 的补充,将尽可能多的功能整合到旧硬件中。在 OpenGL 3 和 4 之间进行选择,有时3.3 可能是更好的选择。然而,4.1 增加了 GL ES 2.0 兼容性和一些不错的功能。


更大的工作流程差异之一是通过新的曲面细分着色器在管道中添加 GPU 编程步骤。另一个是要渲染到的多个视口。我相信新的详细程度功能会改变我正在使用的工作流程,也许还会改变其他很多,尽管我没有深入研究过这个功能。

如果您发现任何误解或需要改进的地方,请告诉我。

主题演讲(显然在询问元数据时从答案中删除了。用于临时参考实际答案是什么。)

附录 G - K对于OpenGL 3.1功能到OpenGL 4.1 功能

Khronos Group 发布的 OpenGL 4.0可能“更容易阅读”:)

  • 采样器对象
  • 实例化数组和着色器
  • texture_cube_map_array 和 texture_gather

  • GLSL 4.0动态 LOD

  • shader_subroutinesample_shading
  • 分离着色器对象
  • 增加纹理/渲染缓冲区所需的大小
  • 64位浮点顶点属性
  • get_program_binary
  • +2镶嵌着色器
0 投票
3 回答
1007 浏览

opengl - OpenGL 4.0 GPU 绘图功能?

在 Wikipedia 和其他来源对 OpenGL 4.0 的描述中,我读到了这个特性:

绘制由 OpenGL 或 OpenCL 等外部 API 生成的数据,无需 CPU 干预。

这是指什么?

编辑

似乎这必须指的是 Draw_Indirect 我相信它以某种方式扩展了绘图阶段以包括来自着色器程序或互操作程序的反馈(基本上是 OpenCL/CUDA) 看起来好像有一些警告和技巧来让电话继续停留在 GPU 上持续第二次运行后的任何延长时间,但这应该是可能的。

如果有人可以提供更多关于在没有 CPU 的情况下使用绘图命令的信息,或者可以更好地描述间接绘图,请随时这样做。将不胜感激。

0 投票
1 回答
1308 浏览

opengl - 将 OpenGL draw_indirect 与 OpenCL 一起使用

我并没有 100% 清楚地了解 Draw Instanced/Draw Indirect 系列函数一直到 glDrawElementsInstancedBaseVertexBaseInstance 是如何协同工作的。

使用支持 OpenGL 4.0+ 和 OpenCL 互操作的硬件和驱动程序,我们如何(如果可能)利用诸如间接绘制(现在也是多绘制间接)之类的工具来跨多个帧绘制实例化几何,同时更改 GPU 上的几何?

例如,是否可以对形状进行细分,然后通过 opencl 对形状应用一些过滤器,同时参考 CPU 仅在需要时才需要剔除的几何形状?

*原帖经过大量编辑

0 投票
5 回答
77446 浏览

opengl - 从 4.1 版开始,OpenGL 中文本渲染的最新技术是什么?

关于 OpenGL 中的文本渲染已经有很多问题了,比如:

但主要讨论的是使用固定功能管道渲染纹理四边形。当然,着色器必须做出更好的方法。

我并不真正关心国际化,我的大部分字符串都是绘图刻度标签(日期和时间或纯数字)。但是绘图将以屏幕刷新率重新渲染,并且可能会有相当多的文本(屏幕上不超过几千个字形,但足以让硬件加速布局很好)。

使用现代 OpenGL 进行文本渲染的推荐方法是什么?(使用该方法引用现有软件很好地证明了它运行良好)

  • 接受例如位置和方向以及字符序列并发出纹理四边形的几何着色器
  • 渲染矢量字体的几何着色器
  • 如上所述,但使用曲面细分着色器
  • 用于进行字体光栅化的计算着色器
0 投票
1 回答
1124 浏览

webgl - 如何通过 WebGL 使用 OpenGL 4 功能

我想使用来自 WebGL 的 OpenGL 4 的一些功能(特别是曲面细分着色器和更新的着色器语言版本)。这是否可能,以符合标准的方式或骇人听闻的方式?我可以使用一些神奇的值来代替 gl.FRAGMENT_SHADER 来告诉底层 GL 实现编译曲面细分着色器吗?

0 投票
3 回答
13065 浏览

opengl - glLineStipple 在 OpenGL 3.1 中已弃用

glLineStipple已在最新的 OpenGL API 中弃用。它用什么代替?如果不更换,如何获得类似的效果?(我当然不想使用兼容性配置文件......)

0 投票
1 回答
3126 浏览

opengl - 使用统一 sampler2d[] 时出现无法解释的行为

很抱歉,但这需要一点解释。我试图让它尽可能简单。

我想做的事: 我正在可视化高度场。一个高度字段可能有多个补丁。补丁是改变高度场的较小纹理。

我正在使用 OpenGL 4.0,主要是镶嵌着色器。然而,对于这个问题,这应该是无关紧要的。

什么都在工作。 我有工作的高度场(没有补丁)的可视化。关于这个问题的有趣部分是镶嵌评估着色器和片段着色器。

细分评估着色器从高度场采样器中为每个顶点获取其高度。

片段着色器使用属于手头片段的顶点的相对高度来访问一维高度调色板纹理。请暂时忽略高度梯度。它用于计算法线。这完全正常。

在每个着色器之前包含以下代码。它主要包含所有统一和辅助功能。

问题
只要我不访问补丁制服,上面描述和粘贴的着色器都可以正常工作。

sampler2D[] 背后的想法是有一个数组,而这个数组的每个纹理可能有不同的大小。我知道每个构造都使用(在这种情况下)20 个纹理单元。这个限制很好。

当我访问补丁统一时,片段着色器仅输出黑色像素。镶嵌评估着色器工作正常,我知道,因为我可以看到高度场中的山丘,这不是它的一部分。

我非常感谢任何建议。关于这个问题。

我知道我可以使用 sampler2DArray,但是每个元素(纹理)必须具有相同的大小。但我需要补丁大小是灵活的。将补丁切割成固定大小的纹理并在着色器中将它们重新缝合在一起,这可能是一种替代方案,但我不想实现这种组织开销,除非我真的必须这样做。

信息日志

0 投票
1 回答
761 浏览

c++ - 如何在 OpenGL 中实现绘画(支持图层)?

情况

我正在实现一个高度字段编辑器,有两个视图。主视图以 3D 显示高度字段,启用轨迹球导航。编辑视图将高度字段显示为 2D 图像。
在这个高度场的顶部,可以应用新的图像,改变它的外观(切割孔、降低、升高特定区域)。这称为补丁
高度场和补丁都是一个通道灰度 png 图像。

对于可视化,我使用可视化库框架 (c++) 和 OpenGL 4。

任务
实现一个绘图工具,在 2D 编辑视图(正交投影)中可用,它在运行时创建这个补丁(作为单独的图像)。

重要说明/限制

  • 高度场的图像可以缩放、旋转和转置。
  • 补丁需要与高度场具有相同的比例,因此补丁中的一个像素正好覆盖高度场中的一个像素。
  • 由于缩放,帧缓冲区像素的大小可能大于或小于高度场/补丁图像像素的大小。
  • 场景包含不应出现在补丁中的对象(例如:指向箭头)。

问题 什么是完成这项任务的正确方法?到目前为止,我有以下想法:

  • 使用某种 QT 画布创建补丁,然后将其映射到高度场图像提案并将其保存为新补丁。这将在每次用户开始绘图时完成,这样实现撤消将很容易(删除最后创建的补丁)。
  • 将中性色图像与 textre 缓冲区对象结合使用,自己实现某种画布。这样,每次用户停止绘制画布的内容时,都会将其映射到高度字段并保存为补丁。为下一幅画重置画布。
  • 下面是一些使用帧缓冲区对象的示例。但是我不确定这种方法是否符合我的需求。当我使用 open gl 将子图像绘制到帧缓冲区中时,结果图像是否包含所有数据?