问题标签 [geometry-shader]
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.
directx - 几何着色器在原点接收额外点
我在使用几何着色器时遇到了一个非常奇怪的问题。我制作了一个非常简单的几何着色器,它将一个点转换为一个三角形。
这是着色器:
我向它发送 4 个这样的顶点:
我得到这个输出:
如您所见,我只向输入汇编器发送了 4 个三角形,输出中输出了 5 个。
关于为什么会发生这种情况的任何想法?恐怕这可能与缓冲区分配的额外内存有关……但我似乎无法弄清楚问题到底出在哪里。
提前致谢!
glsl - 使用lines_adjacency的GLSL几何着色器
我正在编写一个 GLSL 几何着色器,我正在尝试使用lines_adjacency
输入布局,但它不起作用。lines
我使用输入布局的第一次通过测试工作正常:
但是当我切换到lines_adjacency
输入时它不会画任何东西:
我知道我实际上并没有在这里使用邻接点,但我最终会需要它们。我是 GLSL 新手,所以任何帮助将不胜感激,谢谢。
opengl - Opengl几何着色器整数纹理提取失败
我正在尝试从在 GeForce 330m 上运行的几何着色器中采样整数纹理。它似乎返回了我加载到纹理中的其他值。我使用这段代码(基本上)来创建和加载纹理:
这个想法是,一个特定的像素被设置为具有 400 的 w 值。然后我在我的几何着色器中使用它:
使用应该相等的已注释掉的固定值会导致发出某些东西(IE,一分)。如果我使用实际的 texel 提取,它不会返回任何内容。我知道的所有可能产生影响的值现在都被硬编码了,所以我不知道为什么这不起作用。这不是完整的代码(OO 设置,需要查看很多内容),但这些是具有适用数据的相关 OpenGL 调用。
c++ - HLSL 几何着色器四边形正在移动
我正在尝试使用 HLSL 中的几何着色器将单个点转换为四边形。当我不使用几何着色器并尝试显示单个像素时,它工作得很好。但是当我使用它时,四边形正在被绘制,但它们似乎每 100 帧更新或某事移动到另一个位置。
这是我的精灵类(我不完全确定那里的代码..尤其是顶点缓冲区和绘图调用):
这是我的着色器:
正如您可能看到的,我正在使用相机向上和向右矢量来使四边形屏幕对齐。在这里我很不确定我的代码(这是正确的方法吗?) vertex[0].Rad 是定义四边形大小的半径或比例。
我感谢任何帮助-谢谢
opengl - 每帧几何修改:OpenCL 或 GLSL 几何着色器?
我正在建造水面,我希望正弦顶点移动以获得波浪对水面的影响。在选择 OpenGL 之前,我的理解是最好在几何着色器中完成。
然而,目前,我正在使用 OpenGL 2.1 的 OpenGL ES 2.0 子集,严格利用现代/可编程管道。此版本中不提供几何着色器。
我有三个选择:
- 在 CPU 上进行所有顶点修改,并为所有水面的每一帧上传 VBO,因此仅使用 OpenGL 2;
- 升级到 OpenGL 3.2 并为此使用几何着色器;
- 使用 OpenGL 2 和 OpenCL 来修改顶点,OpenCL 使用 GPU 作为它的上下文来减少瓶颈。
首先,我想让事情变得简单。所以考虑到我还不知道 OpenCL,也许我应该坚持将大批量发送到 CPU?
c++ - 几何着色器和深度 FBO
当涉及几何着色器时,是否有关于渲染到 FBO 的特殊规则?
上下文:我正在尝试在场景中实现阴影映射,其中包括以不同方式渲染的不同类型的对象:网格,通过 VBO 和着色器以标准方式渲染 Point sprite 粒子,使用顶点和片段着色器 Quad 粒子渲染,作为点发送,但在几何着色器中扩展为四边形
我正在以标准方式进行阴影映射,这涉及创建深度 FBO 并从灯光的角度向其渲染对象的深度。网格和点精灵工作正常,但几何着色器四边形粒子的深度没有被渲染到 FBO。
这是标准(非 FBO)深度缓冲区。注意前景中的大圆形颗粒。
这是呈现给 FBO 的相同视图。请注意,仅绘制了网格和点精灵粒子的深度。
我的 FBO 设置如下(它基于 OpenGL 4 Shading Language Cookbook 的第 7 章):
应该渲染四边形粒子深度的着色器是:
当然,深度测试是启用的。我已经通过 gDebugger 运行它,它根本无法检测到任何错误。我已经尝试告诉片段着色器实际绘制东西,但这也没有什么区别(没有尝试将不同的值写入 gl_FragDepth)。
点精灵粒子和四边形粒子之间的唯一区别是几何着色器的使用。我正在同时渲染两者并使用相同的统一值(相同的转换矩阵),并且我已经运行 gDebugger 来确保。
我已经在一台装有驱动程序版本 8.17.13.142 的 nVidia GTX 560 Ti 和另一台装有 Radeon Mobility HD 5650 的计算机上对此进行了测试。我在两者上都得到了相同的结果。
我是否犯了任何明显的错误,或者我应该知道一些具体的事情?
opengl - 什么会导致 glDrawArrays 生成 GL_INVALID_OPERATION 错误?
我一直在尝试使用 OpenGL 和 GLSL 编写 Marching Cubes 算法的两遍 GPU 实现,类似于 GPU Gems 3 第一章中详述的那个。但是,glDrawArrays
在我的第一遍调用中始终以GL_INVALID_OPERATION
.
我查找了所有我能找到的文档,并找到了glDrawArrays
可能引发该错误的这些条件:
GL_INVALID_OPERATION
如果非零缓冲区对象名称绑定到启用的数组或GL_DRAW_INDIRECT_BUFFER
绑定,并且缓冲区对象的数据存储当前已映射,则生成。GL_INVALID_OPERATION
如果glDrawArrays
在 的执行glBegin
和对应的 之间执行,则生成glEnd
。GL_INVALID_OPERATION
将由glDrawArrays
或glDrawElements
如果当前程序对象中的任何两个活动采样器属于不同类型,但引用相同的纹理图像单元。GL_INVALID_OPERATION
如果几何着色器处于活动状态并且模式与当前安装的程序对象中几何着色器的输入基元类型不兼容,则会生成。GL_INVALID_OPERATION
如果模式是GL_PATCHES
并且没有曲面细分控制着色器处于活动状态,则生成。GL_INVALID_OPERATION
如果将图元的顶点记录到用于变换反馈目的的缓冲区对象会导致超出任何缓冲区对象大小的限制,或者超出由 设置的结束位置偏移量 + 大小 - 1,则会生成glBindBufferRange
。GL_INVALID_OPERATION
如果不存在几何着色器,则生成glDrawArrays()
变换反馈,并且模式不是允许的模式之一。GL_INVALID_OPERATION
如果存在几何着色器,则生成glDrawArrays()
变换反馈,并且几何着色器的输出图元类型与变换反馈图元模式不匹配。GL_INVALID_OPERATION
如果绑定的着色器程序无效,则生成。- EDIT 10/10/12:
GL_INVALID_OPERATION
在使用变换反馈时生成,并且绑定到变换反馈绑定点的缓冲区也绑定到数组缓冲区绑定点。这是我遇到的问题,因为我绑定的缓冲区有错字。虽然规范确实声明这是非法的,但在我找到的任何文档中,它都没有列在 glDrawArrays 下作为它可能引发错误的原因之一。
不幸的是,我找不到任何一份官方文档涵盖其中的 3 个以上。我不得不从众多来源收集这份清单。第 7 点和第 8 点实际上来自文档glBeginTransformFeedback
,而第 9 点似乎根本没有记录。我在某处的论坛帖子中发现了它。但是,我仍然不认为这个列表是完整的,因为这些似乎都不能解释我得到的错误。
- 我根本没有在我的程序中的任何地方映射任何缓冲区。
- 我正在使用核心配置文件,因此
glBegin
甚至glEnd
不可用。 - 我有两个采样器,它们的类型不同,但它们肯定映射到不同的纹理。
- 几何着色器处于活动状态,但它的输入布局是
layout (points) in
,并且glDrawArrays
正在使用 调用GL_POINTS
。 - 我没有使用
GL_PATCHES
或任何类型的镶嵌着色器。 - 我已经确保我分配了几何着色器可能输出的最大空间量。然后我试着把它翻了两番。没有帮助。
- 有一个几何着色器。看下一点。
- 正在使用变换反馈,并且有一个几何着色器,但输出布局是
layout (points) out
并且glBeginTransformFeedback
被调用GL_POINTS
。 - 我尝试在调用 to
glValidateProgram
之前插入对的调用glDrawArrays
,它返回了GL_TRUE
。
实际的 OpenGL 代码在这里:
glDrawArrays
实际错误是对in的调用RenderPass1
。值得注意的是,如果我注释掉对glBeginTransformFeedback
and的调用glEndTransformFeedback
,则glDrawArrays
停止生成错误。所以不管有什么问题,它可能与变换反馈有关。
2012 年 8 月 18 日晚上 9 点编辑:
我刚刚在 gDEBugger 中发现了 NVIDIA GLExpert 功能,这是我以前不熟悉的。当我打开它时,它提供了更多关于 的信息GL_INVALID_OPERATION
,特别是The current operation is illegal in the current state: Buffer is mapped.
. 所以我遇到了上面的第 1 点。虽然我不知道怎么做。
我的代码中的任何地方都没有调用glMapBuffer
或任何相关函数。glMapBuffer
我将 gDEBugger 设置为在对、glMapBufferARB
、和的任何调用时中断glMapBufferRange
,并且它在任何地方都没有中断。然后我在开头添加了代码来显式地取消映射打扰缓冲区。错误不仅没有消失,而且对now 的调用都 generate 。因此,如果我使用的两个缓冲区都没有映射,那么错误来自哪里?glUnmapBuffer
glUnmapBufferARB
RenderPass1
glUnmapBuffer
The current operation is illegal in the current state: Buffer is unbound or is already unmapped.
2012 年 8 月 19 日上午 12 点编辑:
根据我在 gDEBugger 中从 GLExpert 中得到的错误消息,似乎调用glBeginTransformFeedback
导致绑定的缓冲区GL_TRANSFORM_FEEDBACK_BUFFER
被映射。具体来说,当我单击“纹理、缓冲区和图像查看器”中的缓冲区时,它会输出消息The current operation is illegal in the current state: Buffer must be bound and not mapped.
。但是,如果我在glBeginTransformFeedback
and之间添加这个glEndTransformFeedback
:
它输出 0,表示GL_TRANSFORM_FEEDBACK_BUFFER
未映射。如果这个缓冲区映射到另一个绑定点,这还会返回 0 吗?为什么要glBeginTransformFeedback
映射缓冲区,从而使其无法用于转换反馈?
我在这里学到的越多,我就越困惑。
2012 年 10 月 10 日编辑:
正如我在下面对 Nicol Bolas 解决方案的回复中指出的那样,我发现了问题,并且与他发现的问题相同:由于一个愚蠢的错字,我将同一个缓冲区绑定到输入和输出绑定点。
我在发布问题两周后发现了它。我曾经沮丧地放弃了一段时间,最终回来并基本上从头开始重新实现整个事情,定期比较旧的、不工作的部分和部分。当我完成后,新版本就起作用了,当我搜索出差异时,我发现我绑定了错误的缓冲区。
opengl - 我可以在几何着色器中导出三角形而不是三角形条吗?
是否有可能只从几何着色器导出三角形而不是三角形条?这带来了一些有趣的可能性。OpenGL 3.3。
指定巫婆输出模式执行着色器。如果我尝试:
它编译和工作正常,但它的表现形式与三角形条带相同。
还有 GLSL 语言规范 3.3:
几何着色器输出的布局限定符标识符是
- 布局限定符 id
- 积分
- line_strip
- 三角带
- max_vertices = 整数常量
这里似乎没有“三角形”。
directx-11 - 如何在 DirectX11 的几何着色器中实例化?
我知道在顶点着色器中你这样做:
在几何着色器中使用 instancedPosition 的等价物是什么?就像我想实例化一个由 1 个顶点组成的模型并为每个实例在几何着色器中制作一个四边形并将四边形的位置设置为对应的 instancePosition 的位置实例缓冲区中的实例。
cg - CgFX 几何着色器
如何在 CgFX 中使用几何着色器?实际上如何在“技术”中指定几何着色器?
清单如下,顶点和片段着色器编译得很好。但是“NVIDIA FX Composer 2.5”'error C3001 no program defined'
在我添加'GeometryProgram'
到'technique'
.