问题标签 [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.
opengl - glew 不获取 glDrawArraysInstancedBaseInstance
我正在尝试使用glDrawArraysInstancedBaseInstance但链接器抱怨 __glewDrawArraysInstancedBaseInstance 未解决。
glew-1.9.0 安装在机器上,据我所知它应该链接它。
作为临时工作,我只是自己获取函数,它有效。但这并不能帮助我理解为什么 glew 似乎不适用于该功能。
实际上,glew 似乎不适用于任何 opengl 3.3+
为了验证该功能应该可用,我使用glfwExtensionSupported("GL_ARB_base_instance")
.
需要明确的是,这是 GLFW 功能,而不是 GLEW 的扩展检查器。
我正在使用 glfw 创建我的窗口和 4.3 核心配置文件上下文
我的系统:
NVidia gtx 550 ti,带有最新的驱动程序
Ubuntu 12.04
为了编译这个,我在 make 文件和 CMakeLists.txt 中使用 CMake:
target_link_libraries(app GL GLU GLEW glfw)
c++ - OpenGL Programming Guild 第八版,示例程序和“NumVAOs”
对于看过我之前问题的任何人,在完成了 2.1 版的红皮书之后,我现在转向 4.3 版。(你说老胡说,因为你们中的许多人多年来一直告诉我这样做。)
所以,我已经深入第 3 章,但仍然没有让第 1 章的示例程序正常工作。
我有两个问题。(实际上是3。)首先,它不编译。好的,这是一个问题,但考虑到接下来的两个,有点无关紧要。其次,我不完全了解它是如何工作的或它试图做什么,但我们会继续讨论的。
第三,在我看来,这段代码的作者是个十足的魔术师。我建议这里正在发生各种修补黑客行为。这很可能是因为第 2 个问题,即我不明白它要做什么。写这本书的人当然不是白痴,但请耐心等待,我举个例子。
这是取自main.cpp
文件顶部的一段代码。稍后我将包含文件的其余部分,但现在:
如果我理解正确,这给出VAO_IDs::Triangles
了 的值1
,因为枚举是从零开始的。(我希望我在这里是正确的,否则我会很尴尬。)
片刻之后,您可以看到这一行:
GLuint
由于 NumVAOs 等于 1,它声明了一个包含 1 个 GLuint 的数组。现在,首先,不应该VAO_IDs::NumVAOs
吗?
其次,到底为什么以这种方式使用枚举?出于显而易见的原因,我永远不会使用这样的枚举 - 不能有多个具有相同值的数据,没有明确指定值等等......
我在这里吠叫正确的树吗?这样做是没有意义的...... VAO 应该是一个全球性的,像这样,肯定吗?GLuint NumVAOs = 1;
这只是对枚举的滥用!
事实上,下面的语句const GLuint NumVertices = 6;
出现了。这是有道理的,不是吗,因为我们可以根据需要更改值 6,但我们不能将 NumVAOs 更改为 0,例如,因为 Triangles 已经设置为 0。(为什么它在枚举中?说真的?)
无论如何,忘记枚举的......现在......好吧,所以我做了很多事情,这就是问题的结束......我有任何进一步的评论现在都在代码中。你可以忽略大部分 glfw 的东西,它本质上与 glut 相同。
我意识到这是一个非常冗长的问题,但我认为重要的是解释为什么我认为它的代码很疯狂,而不是像很容易那样说“我不明白”。有人可以解释为什么这些非常聪明的人决定这样做,以及为什么会出现错误。(我在网上找不到任何关于此的内容。)
opengl - GLEW 做什么,我为什么需要它?
好的,所以我已经知道为什么我需要 GLEW,但只是在一定程度上。
如果我使用现代 OpenGL 的东西,可能从 3.0 版开始,和/或使用核心配置文件,则需要 GLEW,因为没有它编译会产生错误,例如glGenVertexArrays
未声明。
所以 GLEW 做了一些后台工作,可能包括我们想要使用的现代 OpenGL 函数。
除此之外,它还有什么作用吗?另外,它是如何工作的。
例如,它是否改进了跨平台编译?(例如,如果从 Linux 迁移到 Windows 或 OS X,需要对代码进行较少的修改吗?
它是否也提高了图形硬件的“跨平台性”?例如,假设我们有两台相同的计算机,包括操作系统。在一个系统上使用 OpenGL 4.3 命令编译程序。如果其他系统的显卡或驱动程序仅支持 OpenGL 3.3,GLEW 是否有帮助?(也许是为旧版本的 OpenGL 编译着色器?)
所以你可能会看到我实际上并不知道 GLEW 做什么或它是如何做到的。
最后一点;有谁知道如何将 GLEW 与 GLFW 一起使用?实际上,我可能会将其作为一个单独的问题发布。
opengl - 不可变纹理是什么意思?
ARB_texture_storage被引入 OpenGL 4.2 核心。
你能解释一下纹理对象的不变性是什么意思吗?
为什么它比以前的纹理使用更好,这个功能有什么缺点?
我知道我可以阅读这个扩展的规范(我做过:)),但我想看看一些例子或其他解释。
opengl - 以编程方式实现百万网格?
我有一个用单个 fullscreen 绘制的平面GL_QUAD
。
我想在 my 指定的每个点使这个表面变形GL_Texture2D
,最好是通过某种着色器。
在我看来,黑色可以对应平坦,白色可以对应山丘。
我想在我的地形上拥有大约 400 万个点,并在程序的每一步更新它们。
我将如何使用几何着色器来做到这一点?着色器是否能够生成新的验证?
c++ - OpenGL 4 headers
Where i can download OpenGL 4.0 headers for C/C++?
I found only GL/gl.h
in /compiler/include/
, but it outdated (OpenGL 1.1).
Don't offer libraries like GLEW. I want write my application with pure OpenGL.
opengl - 使用驱动程序不支持的更高版本 OpenGL 的常量是否安全?
例如,我使用 GL_LUMINANCE_ALPHA 将两个组件数据传输到纹理。有人告诉我,像 GL_LUMINACE_ALPHA 这样的内部格式常量在 OpenGL 3.0(可能是 4.0?)或更高版本中已弃用,因此请使用 GL_RG 或 GL_RG8 等。
但是,我的目标 OpenGL 版本是 2.0 或更高版本,并且 OpenGL 2.0 的规范不包含 GL_RG/GL_RG8。在这种情况下,我认为有三种可能:
- 如果程序可以在仅支持 OpenGL 2.0 的设备上运行良好,请使用 GL_RG/GL_RG8。
- 如果程序可以在 OpenGL 版本高到不推荐使用旧常量的设备上运行良好,请保留旧常量。
- 在运行时检测 OpenGL 版本并为每个版本切换常量。
我应该选择什么?我不想拿 3。除非我必须这样做,因为它使事情变得更加困难和复杂。
c++ - OpenGL 4.2 glBindAttribLocation 无效值?
我正在使用 OpenGL 4.2,但我无法弄清楚为什么我在该程序中收到 GL_INVALID_VALUE 错误。调用 glBindAttribLocation 时出现错误。根据OpenGL 4 参考页,应该从 glBindAttribLocation 生成 GL_INVALID_VALUE 只有两个原因。
void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- 如果索引等于或大于 MAX_VERTEX_ATTRIBS,则生成 INVALID_VALUE。
- 如果程序不是 OpenGL 生成的值,则会生成 INVALID_VALUE。
从下面的程序可以看出,条件 1 没有设置,因为index
is20
和GL_MAX_VERTEX_ATTRIBS
is 34921
。条件 2 不满足,因为program
OpenGL 使用glCreateProgram()
. 那么我怎么可能GL_INVALID_VALUE
出错呢?
终端输出
还要验证 OpenGL 4.2
注:根据参考页。“可以在任何顶点着色器对象绑定到指定的程序对象之前调用glBindAttribLocation。还允许将通用属性索引绑定到顶点着色器中从未使用过的属性变量名称。” 因此,没有加载着色器并且DoesNotExist
不存在的事实不是问题。
opengl - GLSL 4.2 - 语法错误:“布局”解析错误
所以,我最近发现了一个有趣的着色器并尝试编译它。
但是,GLSL 编译器抛出了以下错误:
@(片段着色器)
细节:
- 显卡:AMD Radeon HD 7870(支持OpenGL 4.20)
- 我尝试了 4.2 驱动程序和 4.3 beta 驱动程序。
c - How to bind shader buffer blocks using glShaderStorageBinding?
Using OpenGL 4.3, I want to know how to bind shader buffer blocks using glShaderStorageBinding
.
'binding' qualifiers works fine, but I don't want to use them.
I have written the following code:
Compute Shader:
Expecting result as 1, but returning value as 0 in Obuffer.