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

0 投票
0 回答
2196 浏览

opengl - 曲面细分后在几何着色器中计算每个顶点法线

我已经成功地让镶嵌控制和评估着色器正常工作,但是我的场景的照明仍然是块状的,因为我一直在计算每个(三角形)面法线,而不是每个顶点。现在我正在使用镶嵌,似乎有必要在 tess eval 或几何着色器中为新镶嵌的顶点计算新的法线顶点。

为了获得平滑的每个顶点法线,我需要为共享相关顶点的每个三角形计算每个面法线,然后计算这些面法线的加权平均值。但我不确定如何在 tess eval 或几何着色器中获取所有这些三角形面。几何着色器的layout (triangles_adjacency) in选项看起来很有希望,但没有太多关于如何使用它的信息。

是否可以在不使用法线/凹凸贴图的情况下在 GPU 上计算平滑的每个顶点法线?最终目标是获得平滑的每个顶点照明,这得益于增加的镶嵌细节水平。

这是我的曲面细分控制和评估着色器:

0 投票
1 回答
3169 浏览

directx - 使用几何着色器的广告牌

我正在尝试使用几何着色器渲染广告牌,该几何着色器将点作为输入并输出三角形流(使用 DirectX11)。然而,目前的结果并不是我所期望的。

为了比较,这里有两张截图,渲染了相同的一组粒子,从相同的方向(或多或少,我不得不将相机旋转约 90°)和距离,一次渲染为点,一次用我的广告牌渲染着色器:

使用广告牌着色器渲染的粒子 粒子渲染为点

正如您在第二张图片中看到的那样,当渲染为点时,可以清楚地看到粒子正在远离中心移动,几乎覆盖了整个屏幕,而当使用广告牌着色器渲染时,它们的比例略有变化,但始终保持静止。

不幸的是,我不知道是什么原因造成的。我一直在关注诸如this之类的教程,它解释了应该如何设置矩阵,但是结果表明我的期望或实现是错误的。

下面是广告牌着色器的代码,它构建矩阵来描述粒子的方向,然后为广告牌发射两个三角形:

作为参考,这里是将粒子渲染为简单点的着色器代码:

我注意到的另一个奇怪之处是我的广告牌没有面向相机,至少并非总是如此。但是,从我设置矩阵的方式来看,我希望他们能够这样做。相反,它们仅在从两个相反方向观察时才面向相机,然后在我开始旋转相机时宽度会减小。

这使我相信我在构建矩阵时犯了一个错误,但是我无法发现它。

希望大家能帮我找到问题。在此先感谢您的帮助!

编辑

我似乎已经找到了解决这个问题的方法,但是我不明白为什么会这样。出于某种奇怪的原因,我不能将 localToWorld 矩阵与 ViewProjection 矩阵相乘。相反,我必须将其分为两个步骤,如下所示:

我不明白为什么会这样,也许它与使用 row_major 矩阵而不是默认的 column_major 有关。但就像现在一样,这种行为对我来说根本没有任何意义:矩阵乘法应该是关联的,因此上面的代码片段应该产生与原始代码相同的结果,但显然不是。也许你们中的一些人可以对这里发生的事情有所了解。

0 投票
1 回答
82 浏览

opengl - GLSL 几何值在不应该发生变化时发生变化

我正在使用一个非常简单的程序,它将一组点传递到可编程管道中以绘制一个立方体。我正在尝试对其进行设置,以便我可以每帧更改几何图形(基于一些外部输入),因此,对于照明,我需要在更改面部法线后重新计算它们。我在几何着色器中做它作为练习。

我的着色器如下:

顶点:

几何学:

分段:

我试图计算法线(但出于调试原因,我已经提取了该代码)并且当我运行程序时,正常值被吓坏了。所以我将片段颜色设置为正常值。(看看它是否确实是正常的。)所以无论出于何种原因,“正常”的值在红色、绿色、白色和黑色之间翻转,我无法分辨。如果我只是在片段着色器中指定一个颜色向量,那么立方体在任何地方都可以使用该颜色进行渲染。

为什么正常值会发生变化?

想法?

0 投票
1 回答
647 浏览

opengl - Fragment Diffuse value changing with camera location/rotation

I am attempting to get some simple diffuse lighting to work in GLSL. I have a cube that is being passed in as an array of points and I'm calculating the face normals inside my geometry shader (because I intend to deform the mesh at run-time so I'll need the new face normals.)

My problem is that the diffuse value is changing as I move the camera around the world. so the shading on a face of my cube changes as the camera moves. I have not been able to figure out what I am missing that is causing this. My shaders are as follows:

Vertex:

Geometry:

Fragment:

Thanks

0 投票
1 回答
741 浏览

opengl - 使用曲面细分对带有孔的四边形进行三角剖分

是否可以使用镶嵌着色器对带有孔的四边形进行三角测量?例如,

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

  1. 想象一下我有一个四边形。
  2. 然后我想在四边形的中心打一个洞。
  3. 需要有更多的顶点才能形成那个洞。

还有问题:

  • 我可以使用Tessellation着色器来做到这一点吗?如果是这样,怎么做?
  • 我应该改用几何着色器吗?
0 投票
2 回答
1061 浏览

opengl - 几何着色器调用输入布局限定符

几何着色器的“调用”输入布局限定符有什么作用?

OpenGL wiki只是说它会导致 GS 对每个图元执行多次,然后继续说:

实例的输出原语按 gl_InvocationID 排序。因此,从 3 个实例写入的 2 个基元将创建一个基元流:(prim0, inst0), (prim0, inst1), (prim0, inst2), (prim1, inst0)

每次调用是否都对前一次调用的数据进行操作,例如迭代地优化几何?还是应该使用 gl_InvocationID 来在每次调用中执行不同的操作?还是我完全走错了路?

0 投票
1 回答
392 浏览

opengl - glBindBufferRange 与变换反馈的使用

我有一个缓冲区,我想填充连续的变换反馈,我想知道如何做到这一点。

glBindBufferRange有五个论点,我知道前三个等价于 的论点,但我对和论点glBindBufferBase有几个疑问。offsetsize

如果我的第一个变换反馈产生n基元,从 检索GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN,我的基元是点,并且我想从缓冲区中的那个位置继续,是否应该将偏移量glBindBufferRange设置为n*4*sizeof(GLfloat)?(假设我正在检索 vec4 几何着色器输出)

文档只是这么说offset并且size应该在基本机器单元中(尽管它们有两种不同的类型,GLintptr 和 GLsizeiptr),但我不确定这意味着什么,所以我假设字节,这是正确的吗?

0 投票
1 回答
1114 浏览

glsl - 使用几何着色器(GLSL)生成顶点

最近我正在尝试实现一种算法来实时生成藤蔓。我有点知道如何在 cpu 上执行此操作,但我想使用 GPU 来完成此操作。我在考虑几何着​​色器,但它看起来像几何着色器以原始比例执行,这意味着它将在每个基元上执行完全相同的功能,这不是我所期望的。

从概念上讲,这是我的葡萄藤生长算法的工作原理。选取物体网格上的任意一点作为根点,藤蔓生长算法根据之前产生的点生成一系列点(代表藤蔓)。点的位置受重力、附着力和到三角形面的距离等因素的影响。每个点必须与三角形面的法线在同一侧。

我怎样才能在 GPU 上做到这一点?非常感谢。

0 投票
1 回答
469 浏览

opengl - 在 GLSL 版本 150 中使用 EmitVertex 时值无效

这个 glsl 着色器编译得很好,但是当我尝试用 glUseProgram(); 激活它时 opengl 给了我一个无效值错误:

但是,如果我删除发射顶点的部分,它会起作用。我究竟做错了什么?

0 投票
1 回答
507 浏览

opengl - 几何着色器opengl 3.2 GLSL 150损坏的图元

我有一个简单的几何着色器,我用它来计算每个面的法线。

顶点着色器

几何着色器

片段着色器

一切似乎都顺利通过,大部分几何输出与我预期的完全一样,但是我让这些随机基元在我的网格中弹出和延伸,它们有时甚至从一个网格连接到下一个网格,即来自不同的绘制调用.

我认为这一定与从几何着色器输出三角形条带有关,但我通过使用 EndPrimitve(); 一次从几何着色器中强制输出一个图元。如果有人对为什么会这样,或者我可以通过什么方式进行调试有任何想法或线索,请告诉我。

使用 glDrawElements() 进行绘制;

编辑进度:

是的,所以已经取得了一些进展。当我不在片段着色器中使用几何着色器的正常数据输出时,问题就消失了,我的片段着色器现在看起来像:

但是,如果我取消注释该行:

即使从未使用此计算的输出,问题也会返回。

我猜这与我将信息从几何着色器传递到每个顶点的片段着色器的方式有关。

有任何想法吗 ??