问题标签 [opengl-3]

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 投票
4 回答
45527 浏览

opengl - OpenGL VAO 最佳实践

我面临一个我认为与 VAO 相关的问题,但我不确定..

我不确定 VAO 的正确用法,我在 GL 初始化期间所做的很简单

其次是

后来,在我的绘图管道中,我只调用了 glBindBuffer()、glVertexAttribPointer()、glEnableVertexAttribArray()等等......而不关心最初绑定的 VAO

这是正确的做法吗?

0 投票
1 回答
697 浏览

opengl - 程序管道着色器变量交换

我需要一个 vec4 和一个浮点数从顶点着色器传递到几何着色器,然后再传递到片段着色器。3 个着色器属于 3 个不同的程序,以保持统一的唯一性,这 3 个着色器收集在单个程序管道中,并根据需要附加/分离几何着色器。

GL_ARB_separate_shader_object 扩展说:

GLSL 有一个“名称会合”模型,用于将不同的输出变量连接到后续着色器的不同输入变量。使用单独的着色器,无法保证前面的着色器是否会写入给定的用户定义的输入变量。HLSL9、Cg 和 OpenGL 程序集扩展程序通过“API 资源会合”模型来处理这种情况。在 GLSL 术语中,这意味着单独的 GLSL 着色器/必须/通过内置变量而不是用户定义的变量进行通信。

很好,在顶点和几何着色器中,我将 gl_FrontColor 用于 vec4,将 gl_FogFragCoord 用于浮动,通过 gl_FogFragCoord 和 gl_Color 在片段中读取它们。

它工作,很好.. 但是.. 我的意思是.. cmon,真的吗?

我可以理解这一切背后的基本原理,但对我来说,这确实是一个糟糕的解决方法。如果它们都在同一个程序管道中工作,真的没有其他方法可以使来自不同程序的不同着色器相互通信吗?

0 投票
1 回答
4870 浏览

opengl - 流水线程序中着色器之间的输入/输出变量

我目前正在使用 3 个不同的着色器(顶点、几何和片段),每个着色器属于不同的程序,都收集在一个程序管道中。

问题是 Geometry 和 Fragment 将它们的变化归零,也就是说,它们不包含先前由管道中的先前着色器写入的值。

对于每个着色器:

对于每个程序:

然后:

在 gl 绘制中:

顶点着色器:

几何着色器:

片段着色器:

我是否错过了在程序管道的不同阶段之间编写/读取不同的一些关键步骤?

更新:

我尝试使用布局位置限定符,以确保每个人都在同一个向量上“交谈”,因为 GLSL 规范指出:

layout-qualifier-id location = integer-constant 只接受一个参数。例如 vec4 normal 中的 layout(location = 3);将确定着色器输入法线分配给矢量位置编号 3。对于顶点着色器输入,位置指定从中获取输入值的通用顶点属性的编号。对于所有其他着色器类型的输入,该位置指定一个向量编号,该向量编号可用于匹配前一个着色器阶段的输出,即使该着色器位于不同的程序对象中。

但添加

不编译

所以我尝试通过 glBindAttribLocation() 做同样的事情,我没有收到任何错误,但行为仍然没有改变

更新 2

如果我添加“#extension GL_ARB_separate_shader_objects:启用”

然后我可以使用 layout(location = n) in/out var; 然后它就起作用了。

成立:

这很有趣..如果您声明#version 330,即使您启用扩展名,您也不​​应该使用布局输出限定符.. ..但扩展名再次声明:

此 ARB 扩展扩展了 GLSL 语言对布局限定符的使用,以提供跨阶段接口。

现在我想知道为什么使用 glBindAttribLocation() 或仅使用普通名称匹配+启用 ARB 扩展时它不起作用!

0 投票
1 回答
2681 浏览

opengl - 在现代游戏中以 OpenGL 3.2 为目标是否合理?

我目前正在开发使用 OpenGL 进行渲染的游戏/引擎,并且最近已经开始逐步取消对固定功能管道的支持。我可以针对 2.1,但是我想使用曲面细分或几何着色器以及 2.1 中不存在的各种较新的 GLSL 功能。

考虑到游戏至少要再过一年才能发布,将 3.2 作为最低基础是否合理?

请注意,该游戏确实利用了新功能,例如用于延迟照明的 MRT 帧缓冲区等,我根本不打算支持固定功能硬件。所以它不是 2.1 就是 3.2,我倾向于 3.2。有谁知道有多少人拥有 3.2 兼容卡以及采用率的粗略数字?

0 投票
5 回答
20751 浏览

opengl - VAO 和元素数组缓冲区状态

我最近使用顶点数组对象 (VAO) 编写了一些 OpenGL 3.3 代码,后来在英特尔图形适配器上对其进行了测试,令我失望的是,元素数组缓冲区绑定显然不是 VAO 状态的一部分,因为调用:

没有效果,而:

渲染几何。我认为这只是英特尔实现 OpenGL 中的一个错误(因为它在 GL_ARB_vertex_array_object(甚至在 GL_OES_vertex_array_object)中明确指出元素数组保存状态的一部分),但后来它发生在移动 NVIDIA Quadro 4200 上。这不好玩.

它是驱动程序错误、规格错误还是我的代码中某处的错误?该代码在 GeForce 260 和 480 上完美运行。

有人有类似的经历吗?

同样奇怪的是 GL_EXT_direct_state_access 没有将元素数组缓冲区绑定到 VAO 的函数(但它确实具有指定顶点属性数组和数组缓冲区的函数)。GPU制造商是在搞砸规格并欺骗我们,还是什么?

编辑

我原本不打算展示任何源代码,因为我认为这里没有必要。但根据要求,这是重现问题的最小测试用例:

上面的代码创建了一个包含三个四边形的顶点缓冲区,红色一个,蓝色一个和黑色一个。然后它创建三个指向各个四边形的索引缓冲区。然后创建并设置两个 VAO,一个应包含红色四边形索引,另一个应包含蓝色四边形索引。根本不应该渲染黑色四边形(假设定义了 BIND_BLACK_QUAD_ELEMENT_ARRAY_BUFFER

这会将视口清除为灰色,并以重复的方式渲染蓝色或红色四边形(它还会打印哪一个)。虽然这适用于桌面 GPU,但它不适用于笔记本 GPU(除非定义了 VAO_DOESNT_STORE_ELEMENT_ARRAY_BUFFER 宏,否则会呈现黑色四边形。取消定义 BIND_BLACK_QUAD_ELEMENT_ARRAY_BUFFER 宏会使四边形变为蓝色,因为蓝色索引缓冲区最后绑定。但它没有无论如何渲染红色四边形。

所以在我看来,这要么是我对 VAO 应该如何工作的理解上的致命误解,要么是我的代码中的错误,要么是驱动程序错误。

完整源
二进制文件(windows,32 位)

0 投票
2 回答
6340 浏览

c++ - 无法部署 GLFW 3.2

所以这个是一个doozie;
我有一个相当大的 OpenGL 解决方案,在 Windows 7 中使用 GLSL 1.5 的 3.2 版核心编写。我使用 GLEW 和 GLM 作为辅助库。当我创建一个窗口时,我使用以下几行:

如果我省略了三个 glfwOpenWindowHint 函数,应用程序会在调用 glDrawArrays(GL_TRIANGLES, 0, m_numIndices); 时使我的视频驱动程序崩溃。

但这是踢球者。当我小组中的其他人尝试更新和运行解决方案时,他们会得到一个没有几何图形的空白窗口。注释掉这三行会使程序对它们运行良好。在使用 3.2core 提示和不使用 3.2core 提示之间存在相当大的差异。我无法确定 nVidia、AMD、台式机或笔记本电脑之间的任何区别。

我能找到的最好的建议是添加 glewExperimental = GL_TRUE; 因为据说 Glew 的核心有问题。它没有任何区别。该解决方案太大而无法发布代码,但我可以根据需要放置着色器、渲染代码等。

非常感谢!这已经杀死了我们好几天了。

0 投票
1 回答
367 浏览

macos - OSX 可用的 OpenGL ARB 扩展

http://developer.apple.com/graphicsimaging/opengl/capabilities/GLInfo_1072_Core.html看来,当前的 OSX 10.7.2 核心 OpenGL 支持仍然限制在 3.20 和 GLSL 1.50

除其他数据外,还有可用的 ARB_ 扩展。

我想知道这些是否是保证存在的最低限度的扩展,或者你是否真的只有这四个,即:

我目前正在开发一个应该在 OSX 上运行并使用 ARB_separate_shader_objects 的便携式应用程序,这是否意味着它肯定不会在 OSX 10.7.2 上运行?

0 投票
3 回答
3973 浏览

opengl - 使用 glDrawElements 时在 OpenGL 核心配置文件中拾取三角形

我正在使用 glDrawElements 绘制三角形网格,并且希望能够使用鼠标单击来选择/选择三角形。三角形的网格可以非常大。

在固定功能的 OpenGL 中,有可能使用 GL_SELECT: http ://content.gpwiki.org/index.php/OpenGL:Tutorials:Picking .. 但是我只对使用 OpenGL 核心配置文件感兴趣。

另一种可能性是使用“颜色编码”:

http://www.lighthouse3d.com/opengl/picking/index.php?color1

http://www.opengl.org/resources/faq/technical/selection.htm

..但据我所知,在使用 glDrawElements 时还不能指示每个三角形的信息?

最后,我可以通过鼠标位置拍摄拾取射线来进行基于 CPU 的拾取,但这会很慢,因为我想我必须在 CPU 上转换三角形,所以我更喜欢基于 GPU 的解决方案。

有没有人建议在 OpenGL 核心配置文件中使用 glDrawElements 时最好的选择方法是什么?

0 投票
1 回答
756 浏览

opengl - 调用 glDrawElementsInstanced 时出现分段错误

我发现将 glDrawElements 更改为 glDrawElementInstanced 会导致其他有效程序中的段错误。编译没问题。gdb 说 glDrawElementInstanced 是段错误。谁能猜出一个问题?

在 x86_64 GNU/Linux 上运行。

CMakeLists.txt 的一部分:

段错误的位置:

0 投票
2 回答
804 浏览

opengl - 各向异性过滤和多重采样

我正在阅读 OpenGL Superbible 第 5 版。我遇到了几个术语,虽然在书中解释了对我来说还不是很清楚。

首先是多重采样。我知道它用于平滑多边形并帮助渲染更好的图像。我不明白它与抗锯齿有何不同。

其次是各向异性过滤。我知道这种纹理过滤的效果,但我想知道它是如何以及何时使用的。可能是算法的一般解释?我用谷歌搜索了它,维基百科并没有解释太多。