问题标签 [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 投票
1 回答
805 浏览

opengl - glVertexAttribPointer 的奇怪行为

我正在创建默认 VAO 和一个 VBO,并绑定它们。我正在将模型数据加载到结构数组 vertex_data_t

然后在绘图功能中我做:

我越来越好,阴影苏珊娜:

http://i.stack.imgur.com/uRjpv.png

然而,这是错误的!正常属性的 glVertexAttribPointer 的最后一个参数应该是 12 aka (const GLvoid *)offsetof(vertex_data_t, normal),但是当我这样做时,我的 Suzanne 坏了:

http://i.stack.imgur.com/zBjTS.png

这怎么可能?着色器如何知道法线的偏移量?

顶点着色器:

0 投票
1 回答
1345 浏览

opengl - 将 gl_PrimitiveID 输出到自定义帧缓冲区对象 (FBO) 时出现问题

我有一个非常基本的片段着色器,我想将“gl_PrimitiveID”输出到我定义的片段缓冲区对象(FBO)。下面是我的片段着色器:

我这样设置我的 FBO:

出于某种原因,glReadPixels 给了我一个“GL_INVALID_OPERATION”错误?但是,如果我将 renderbufId1 的内部格式从“GL_RGB32UI”更改为“GL_RGB”,并且在 glReadPixels 中使用“GL_FLOAT”而不是“GL_UNSIGNED_INT”,那么一切正常。有谁知道我为什么会收到“GL_INVALID_OPERATION”错误以及如何解决它?

是否有另一种输出“gl_PrimitiveID”的方法?

PS:我想像这样输出'gl_PrimitiveID'的原因在这里解释:Picking triangles in OpenGL core profile when using glDrawElements

0 投票
1 回答
1172 浏览

opengl - 创建 16 位纹理时出现“无效枚举数”

我正在尝试创建一个 16 位纹理来保存我的地形补丁的高度图,但是以下两个都返回“无效枚举”错误。CHECK_GL_ERROR() 宏将 gluErrorString 显示为一条消息,如果 glGetError 返回的不是 GL_NO_ERROR 则中断。

我有一个绑定到 GL_TEXTURE_2D 目标的创建纹理,并且有和没有相同的错误:

我在 GTX 560Ti 上使用 OpenGL 3.2 上下文、NVIDIA CUDA 开发驱动程序 286.16。谁能看到我做错了什么?

干杯

0 投票
3 回答
2289 浏览

c++ - 屏幕/玻璃破碎效果

我想在使用 OpenGL(带着色器)的屏幕转换中做类似的事情。我一直在寻找一些教程或类似的东西,但没有任何效果。我怎样才能达到这种效果? 在此处输入图像描述

0 投票
2 回答
645 浏览

c++ - 我可以在我的代码中明确禁用已弃用的 OpenGL 函数吗?

我最近开始编写使用更新的 OpenGL 实现的代码。然而,我确实注意到,在较新的 OpenGL 实现中,许多旧函数被视为已弃用。如果我只想使用正确的功能,有什么方法可以禁用它们?

0 投票
3 回答
1388 浏览

c++ - glVertexAttribPointer 问题(OpenGL 3.x 前向兼容上下文)

按照现代标准,渲染多边形网格的首选方法似乎涉及使用顶点缓冲区对象和索引缓冲区(最终通过调用来绘制glDrawElements()),这正是我试图围绕这些概念进行思考的原因。另外,我坚持使用glVertexAttribPointer()而不是弃用 glVertexPointer()glNormalPointer()等。

我正在使用自定义的二进制3d 文件格式(Wavefront .OBJ 衍生文件),其内容可以或多或少直接memcpy()'d'到顶点数组。这是我声明我的vertex结构的方式:

loadBObj()函数返回一个索引缓冲区(实现为一个简单的unsigned short ints 数组),并用相关的顶点/法线数据填充顶点数组(所有使用的模型都已导出为具有每个顶点法线以获得更平滑的着色结果) .

加载代码本身经过验证可以正常工作。

现在,还要做的loadBObj()是创建一个新的 VBO,如下所示:

loadBObj()调用后,将创建一个索引缓冲区对象(尽管可能不应该这样引用),如下所示:

好的。在实际渲染网格时,我使用了以下代码:

这会产生绝对正确的几何图形,但阴影不太正确:

  • 这是模型的图像,以即时模式呈现:

img http://i44.tinypic.com/i36zcg.png

  • 这是由上述程序生成的:

img2

我的 VBO 处理中发生了什么有趣的事情吗?

0 投票
1 回答
1543 浏览

opengl - GLSL OpenGL 3.x 如何指定通用顶点属性索引和语义之间的映射?

我正在从 HLSL 切换到 GLSL

在顶点缓冲区中定义顶点属性时,必须调用

并传递一个索引。但是如何指定哪个索引映射到着色器中的哪个语义?

例如gl_Normal。如何指定gl_Normal在顶点着色器中使用时,我希望这是索引为 1 的通用顶点属性?

0 投票
1 回答
3744 浏览

d - 用 D 语言用 OpenGL 3 渲染一个简单的矩形

我要疯了,因为我不能在我的屏幕上显示一组简单的三角形。

我正在使用 D 编程语言的废弃绑定使用 OpenGL3(不推荐使用的固定管道)。

你能在下面的程序中发现错误吗?它编译得很好,不会抛出任何 OpenGL/GLSL 错误。它只是用我设置的清晰颜色显示一个空白屏幕。

0 投票
1 回答
6601 浏览

c - OpenGL 渲染上下文生成“失败请求 152 (GLX) 的操作码”(Mesa 8.0 - OpenGL 3.0,Linux)

这是一个大问题:首先,虽然我对 XLib API有所了解,但我想测试并确保在我做任何事情之前我实际上可以创建一个 OpenGL 渲染上下文(3.0),因此我只是复制并粘贴一些测试代码并运行它。

当我运行代码时,我的输出如下:

此外,随后调用glxinfo生产

根据这个规范,我的可能应该工作 - 对吗?如果没有,我能做些什么来改变它?我读过的任何有关此类问题的论坛帖子通常都是由于人们在尝试初始化上下文时缺乏正确的 OpenGL 3.x 实现,这导致他们的输出与我测试过的代码相似.

我还为我的发行版搜索了各种 X11 包,以查看我是否可能会或可能不会错过一些偶然的东西。当然,这是徒劳的,因为我最终安装/更改的任何东西要么让事情变得更糟,要么根本不起作用。

xorg.conf

执行代码

我很困惑这是怎么发生的。有人可以为这个问题提供一些见解和/或解决方案吗?

0 投票
1 回答
3524 浏览

c++ - 为什么我的 OpenGL 3.3 应用程序没有绘制任何东西?

我正在尝试处理 OpenGL VAO/VBO,从概念上讲我在那里,但无论出于何种原因,这个应用程序都没有在屏幕上绘制任何东西。我在 4.2 环境中工作,但我正在为仅核心 3.3 编写。

以下是相关变量的声明:

在一个名为init_scene我的函数中,我有以下内容:

我的 GLSL 程序在哪里链接:

我只使用一个属性,那就是顶点位置。该程序链接没有错误。

这是draw_scene函数本身:

为了更好地衡量,我的顶点着色器:

modelview_matrix是目前只是传入单位矩阵的制服。我想了一会儿可能会绘制一些我根本看不到的东西,所以我将清晰的颜色设置为灰色,这是应该只输出白色的片段着色器:

我读过的所有内容,尤其是本教程和 Superbible,都使事件链非常清晰:

  • 创建 VAO
  • 绑定 VAO
  • 创建一个 VBO
  • 绑定并填充VBO
  • 设置属性指针

我使用 glDEBugger 尝试更清楚地了解为什么这不起作用。我已经设置了 GL 错误,所以我知道 GL 函数本身没有引发错误。我可以看到 VBO 的内容,这是我期望的顶点数据。我唯一不确定的是如何确保 VBO 作为顶点位置数据与 VAO 相关联,并且当我调用绘图函数时 VAO 实际上是正确绑定的。

如果我遗漏了任何必要的内容,请告诉我。谢谢!

更新1:

这是提供加载到 VBO 中的顶点数据的数组:

这是我所有的上下文设置的样子:

更新 2:

Nicol Bolas 在下面的回答提出了一个关于正交可见性的好观点,这是我没有想到的。不幸的是,这似乎不是问题所在。我尝试了他的顶点列表,并关闭了任何剔除,并尝试了这些顶点:

我认为应该画一个正方形,但仍然没有。我还注意到我在调用glDrawArrays12 个元素时应该是 4 个(12 个坐标 = 4 个 x、y、z 顶点),但这也不能解决问题。

更新 3(或“当帖子变得太长时”): 在 gDEBugger 中逐步浏览应用程序,我注意到一些让我感到奇怪的东西。在draw函数中,有一个通常的循环绑定当前 VAO,调用glDrawArrays,绑定 VAO 0 以便可以绘制另一个东西。在这种情况下观察 GL 状态设置,看起来就像GL_VERTEX_ARRAYTRUE我的 VAO 未绑定(即 VAO 0 已绑定)和FALSE我的 VAO 已绑定。这是事情应该是这样的吗?是否GL_VERTEX_ARRAY代表被它取代glBindVertexArray而不是被它增强的状态?此外,将模式从 更改GL_TRIANGLE_STRIPGL_POINTS并设置glPointSize(5.0f)导致在 0、0 处绘制单个点,因此似乎正在创建一个点,但我的顶点着色器没有正确处理它。