问题标签 [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.
opengl - 是否在带有流的几何着色器中指定 EndStreamPrimitive()
EndStreamPrimitive() 只能用于带有流的几何着色器。带有流的几何着色器只能发出 GL_POINTS。但是在 GL_POINTS 中,每个顶点本身都是一个图元。
那么拥有像 EndStreamPrimitive() 这样的函数有什么意义呢?当原始类型 = GL_POINT 时仅指定 EmitStreamVertex() 表示原始结束。
我的下一个问题是几何着色器中的 max_vertices 是什么?
布局(点,max_vertices = 6)出;
我想这是几何着色器将发出的最大顶点数(无论天气如何,它是否使用流)。如果我的几何着色器中有 2 个流,并且我向流 0 发出 2 个顶点,向流 1 发出 3 个顶点。是否应该将 max_vertices 的值设置为 5?
directx-11 - 几何着色器四边形后处理
使用directx 11,我正在开发一个图形效果系统,该系统使用几何着色器在世界空间中构建四边形。然后这些四边形使用片段着色器,其中主要纹理是渲染的场景纹理。有效地在 qorld 空间四边形上产生后期处理效果。其中最简单的是色调效果。
顶点着色器仅将数据传递给几何着色器。
几何着色器根据法线计算额外的顶点。使用叉积,我找到 x 和 z 轴,并在原始位置的每个对角线方向上附加 4 个新顶点的三流(从给定的位置和大小生成四边形)。
像素着色器(色调效果)只是将场景纹理颜色与颜色变量集相乘。
四边形生成并正确显示在屏幕上。然而;
我面临的问题是 uv 坐标的映射无法与后台缓冲区上的图像对齐。也就是说,当使用半 alpha 作为给定颜色的 tint shader 时,您可以看到显示在四边形上的图像不会完美地覆盖后台缓冲区上的图像,除非四边形面向相机。四边形法线与相机 y 轴越接近,图像越偏斜。
我目前正在使用下面的公式来计算 uv 坐标:
我还使用了下面的公式,这导致(IMO)在 uv 中没有考虑到考虑因素。
问题: 如何根据几何着色器中生成的顶点位置获取屏幕空间 uv 坐标?
如果您想让我详细说明任何要点,请询问,我会尽力而为:)
提前致谢。
shader - 几何着色器,MaxVertexCount 未知
我目前正在研究一个着色器,其中顶点的数量不是由三角形的数量定义的,我的着色器每 X 个单位放置一个立方体。
这意味着我无法事先知道它将创建多少个立方体,也不知道它将占用多少个顶点。
但是,您必须放置一个maxvertexcount[x]
. 我在里面放什么x
?
我该如何解决这个问题?
注意:我是几何着色器的初学者,对它们几乎一无所知。
opengl - OpenGL:具有大量立方体的几何着色器性能
所以我写了一个非常简单的 OpenGL 程序来绘制 100x100x100 点,使用几何着色器绘制为立方体。我想将它与我目前使用 DirectX11 可以做的事情进行基准测试。
使用 DirectX11,我可以轻松地以 60fps (vsync) 渲染这些立方体。但是,使用 OpenGL 我被困在 40fps。
在这两个应用程序中,我都是:
- 使用点拓扑仅表示立方体的位置(步幅 = 12 字节)。
- 仅在初始化函数中映射到顶点缓冲区,仅一次。
- 总共只使用了两个绘制调用:一个渲染立方体,一个渲染帧时间。
- 使用背面剔除和深度测试。
- 将状态更改限制在绘制立方体所需的最小值(VBO/着色器程序)。
这是我的抽奖电话:
该函数调用 glBindVertexArray 和 glUseProgram
其余的都是直截了当的。我的 Update 函数只更新相机的位置和视图矩阵,并且在 DirectX/OpenGL 版本中是相同的。
我的顶点着色器是直通的,我的片段着色器返回一个恒定的颜色。这是我的几何着色器:
我见过人们谈论实例化或其他此类渲染方法,但我主要想了解为什么我不能从 OpenGL 获得至少与使用 DirectX 相同的性能 - 就像我在这两种方法中所做的那样似乎和我几乎一模一样。相同的数据,相同的着色器。帮助?
更新 所以我下载了 gDEBugger,这是我的一帧调用堆栈:
opengl - OpenGL 几何着色器编译错误 OSX-Mavericks
我从一个绘制单个 GL_POINT 的工作 OpenGL 程序(带有顶点和片段着色器)开始。然后我附加了一个简单的几何着色器,它在给定一个点作为输入的情况下输出两个点:
当我运行我的程序时,我从 GL 收到以下编译错误:
我的系统规格:
Mac OSX 10.9、Nvidia Geforce 750M、OpenGL 4.1 驱动程序
我还尝试在我的几何着色器中定义以下内容:
但是我的驱动程序不支持扩展。不过这不应该是必需的,因为几何着色器是自 3.2 以来的核心的一部分(来源: https ://www.opengl.org/wiki/Geometry_shader#See_also )
有什么想法吗?
hlsl - HLSL:Triangle-2-Points/Lines Geometry Shader 问题
我正在尝试使用几何着色器扩展渲染器(用于 TressFX),因此我正在采取措施以确保一切正常。因此,我创建了一个简单的传递几何着色器,它适用于三角形,但由于某种原因不适用于线或点(将三角形转换为线和点),因为我看不到输出。结果链接
如果有人能指出为什么它不适用于线条和点,我会很高兴。
代码
ASetPrimitiveTopology 设置为 D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST
顶点着色器
三角形的几何着色器(有效)
点和线的几何着色器(不起作用)
但是,如果我在点/线传递几何着色器中对 output.Position 进行硬编码,我可以设法获得可以在屏幕上看到的输出。
c++ - memoryBarrier() 在几何着色器中的行为异常
我试图了解 memoryBarrier() 在 OpenGL 4.4 中的工作原理,我尝试了以下一次使用纹理图像和一次使用着色器存储缓冲区对象 (SSBO)。基本思想是为需要在我的场景中渲染的许多对象创建一个标志数组,然后在几何着色器中执行一个简单的测试。
对于 GS 中的每个图元,如果至少有一个顶点通过了测试,它会在数组中由该图元的对象 ID 指定的位置设置相应的标志(对象 ID 作为顶点属性传递给 GS)。
然后我执行 memoryBarrier() 以确保所有线程都写入了它们的值。
- 接下来,我从 flags 数组中读取所有基元,如果设置了标志,则只发出一个顶点。
这是我的着色器中的一些代码来解释:
这是一个简单的几何着色器,其中我只使用了一个基于 lineID 的简单测试(我意识到这个测试不需要共享数据结构,但这只是为了测试程序行为)
无论我输入什么值而不是 500,这段代码总是只渲染 2 个对象。如果我将 GS 中的渲染条件更改为 if(flag > = 0),在我看来,所有对象都已渲染,这意味着在着色器读回这些 ID 时永远不会写入 -1。有人可以解释为什么尽管有 memoryBarrier(),但所有着色器调用都不能连贯地看到写入,什么是最有效的解决方法来让它工作?
谢谢。
macos - 如何在 Mac 10.9.3 上将 OpenGL 上下文更改为 3.2
当我意识到我正在使用 OpenGL 2.1 和 GLSL 1.2 时,我的着色器出现了问题。由于直到 1.5 才支持几何着色器,我需要使用另一个 OpenGL GLSL 版本。但是怎么做?我想我最多阅读了 15 个线程,但对我没有任何帮助。
我的 Mac 使用 PyOpenGL 3.0.2 在 10.9.3 上运行。我已经下载了一个 OpenGL 扩展查看器来查看支持哪些版本和扩展。Intel HD Graphics 4000 和 NVIDIA GeForce 650M 在 Core Profile 中支持 OpenGL 3.2,但在 Compatibility Profile 中不支持。
我认为兼容性配置文件是我无法编译几何着色器的原因。它只支持最高 2.1 的 OpenGL。
我试图像这样更改个人资料:
但是这两个函数都是未定义的。而且 GL_SHADING_LANGUAGE_VERSION (1.2) 和 GL_VERSION 2.1 还是一样的。
由于我#version 150 core
在几何着色器中使用了另一个线程,但这也没有效果。
如何更改上下文/版本以使用我的几何着色器?
c++ - 全屏效果的opengl纹理坐标
如何使用纹理图像创建全屏效果?直到现在我这样做:
此代码将我的图像放在屏幕的左上角,但我想要全屏纹理效果。那么,我该如何实现呢?
c++ - opengl绘制椭圆而不是圆形
如果我调用函数 DrawFilledCircleo() 它会生成一个椭圆而不是圆形,即使我输入 glBegin(GL_LINE_LOOP); 它总是使椭圆形
我尝试了不同的功能来绘制圆圈,但它总是使 Oval 。
我把它放在:
更新 :
宽度X = 800; 高度Y = 400;