问题标签 [vertex-attributes]
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.
c++ - 我可以有多个 GL_ARRAY_BUFFER 缓冲区吗?
所以我正在查看关于命令 glVertexAttribPointer 的另一个 SO 问题,我遇到了一些困惑。这个问题的公认答案解释说,
但是当您进行调用时,还有一个额外的隐含状态也存储在属性 0 中:数据是从当前绑定到 GL_ARRAY_BUFFER 的缓冲区中读取的
这对我来说很有意义,但是如果我有多个绑定为的缓冲区GL_ARRAY_BUFFER
怎么办?该方法如何glVertexAttribPointer()
知道要设置哪个属性?
例如,在我的代码中,我正在绘制一个渐变三角形。为此,我创建了 2 个 VBO,一个带有数组中的颜色数据,另一个带有顶点位置。
当我调用命令时,我在哪里指定使用哪个缓冲区?
r - 显示图形顶点的附加信息
我有一个有向图,使用以下示例
我想找到在右键单击顶点时显示附加信息的方法,或者使用在每个顶点上移动鼠标时出现的工具提示来显示信息。我试图为顶点设置属性,但我找不到显示它们的方法。
directx-11 - directx11 中的可选顶点缓冲区对象
我有一些模型(几何)有一些顶点信息。例如位置、法线、颜色、纹理坐标,这些信息中的每一个都有自己的顶点缓冲区。但是其中一些模型有纹理坐标有些没有......为了管理这些差异,我编写了一个顶点着色器,它正在检查常量缓冲区“hasTextureCoordinates”中的标志是否 == 1。如果是这样,它是否使用 texcoord 参数。但是 Directx 并不真正喜欢这种解决方法并打印出:
D3D11 INFO: ID3D11DeviceContext::Draw: Element [3] 在当前输入布局的声明中引用了输入槽 3,但没有缓冲区绑定到该槽。这没关系,因为从空槽读取被定义为返回 0。开发人员也可能知道无论如何都不会使用数据。如果开发人员实际上打算在此处绑定输入缓冲区,这只是一个问题。[执行信息#348:DEVICE_DRAW_VERTEX_BUFFER_NOT_SET]
我不确定每个硬件是否都能正确处理这个问题,而且在输出中看到这个“警告”每一帧也不是很好......我知道我可以编写两个着色器,一个有 texcoods,一个没有 texcoods,但问题是这不是唯一可能缺少的参数……有些有颜色,有些没有,有些有颜色和纹理坐标等等。并且为每个顶点缓冲区输入组合编写一个着色器是极其多余的。这非常糟糕,因为如果我们更改一个着色器,我们也必须更改所有其他着色器。也有可能将着色器的一部分放到不同的文件中并包含它们,但这很令人困惑。
有没有办法说 directx 特定的顶点缓冲区是可选的?或者有人知道这个问题的更好解决方案吗?
opengl - 各种顶点格式和vbo
我使用如下渲染循环;
- 孤立数据并映射缓冲区。
- 记录命令并将生成的顶点写入缓冲区。
- 取消映射缓冲区。
- 迭代可以更改状态、绑定纹理或绘制的命令。
目前,我使用单一交错顶点格式 (SoA),它具有我的任何着色器都可以使用的所有属性。
例如,当使用仅使用位置和颜色的更简单的着色器时,我只会在映射内存中写入我关心的属性,并且着色器代码会简单地忽略所有未使用的属性。
因为这感觉很浪费,我正在考虑为我的每个着色器使用不同的顶点格式。
使用简单着色器渲染的简单对象将使用 SimpleVertex:
而其他多纹理对象将使用多纹理着色器并使用 MultitextureVertex 进行渲染:
我应该如何处理这些不同的格式?
我应该在同一个映射缓冲区中写入所有不同格式的顶点并在绘制之前更改我的 AttribPointers 吗?这样可以节省一些空间。
我应该为每种顶点格式映射不同的缓冲区吗?或许更有效率。
还是我应该保持“一刀切”的顶点格式?这更容易。
我很想知道在这种情况下最好的做法是什么。谢谢。
shader - OpenGL顶点属性,位置有效但texcoord无效?
顶点着色器:
片段着色器:
我在哪里初始化我的图像:
我在屏幕上绘制的位置:
在我运行 1.30 的笔记本电脑上,支持最新的 GLSL 语言版本,因此我无法升级到更新版本。
imgQuadData
保存绘制四边形角的 X/Y 位置以及该角处纹理坐标的 S/T 值。我已经按照本教程了解了我所拥有的。虽然我正在使用 go,但 go-gl 库使得将 C++ GL 调用转换为 go GL 调用变得非常简单。
它的行为就好像Texcoord
在片段着色器中总是vec2(0, 0)
. 如果我在片段着色器中更改该行以vec2(1, 1)
代替使用,Texcoord
那么正方形会正确更改颜色。问题似乎imgQuadData
是没有正确解析顶点着色器以将 S 和 T 值作为非 0 值,我不明白为什么。
如何成功读取我的位置属性但我的 texcoord 属性始终等于 0?
metal - MTLVertexAttributeDescriptors 是必要的吗?为什么需要它们?
我一直在学习适用于 iOS / OSX 的 Metal,我从遵循Ray Wenderlich 教程开始。本教程工作正常,但没有提及MTLVertexAttributeDescriptors
.
现在我正在开发自己的应用程序,我遇到了奇怪的故障,我想知道我不使用的事实是否MTLVertexAttributeDescriptors
与问题有关。
它们有什么区别?我已经能够制作各种具有不同顶点结构的着色器,而我什至不知道这些东西。
我知道您使用它们来描述在着色器中使用的顶点组件的布局。例如,着色器可能会将此结构用于顶点,并且将在下面函数的顶点描述符中设置它。
但即使没有MTLVertexDescriptor
设置,着色器也可以访问顶点缓冲区和position / texCoord
数组中顶点的组件。只需设置顶点缓冲区,着色器就可以访问所有组件。那么描述符有什么用呢?
metal - 如何在 Metal vertex shader MTLVertexAttributeDescriptor 中描述 packed_float3?
我正在将一组结构传递给我的 Metal 着色器顶点函数。该结构如下所示:
};
floatBuffer 函数用于将顶点组装成一个大的浮点数组。我可以通过使用使用“打包”数据类型的结构定义将其传递到我的着色器函数中,如下所示:
这行得通。但是,我想知道如何使用 MTLVertexAttributeDescriptors 和相关的语法来做同样的事情。现在我得到了变形的多边形,大概是因为 float3 和 packed_float3 的字节对齐差异?
这就是我现在尝试定义它并获取垃圾多边形的方式。我收到“packed_float3”对属性无效的错误,所以我试图弄清楚如何使常规 float3、float4 等工作。
请注意,我将第一个属性指定为 float3,但我指定了 3 个浮点的偏移量,而不是 float3 通常使用的 4 个。但这显然还不够。我想知道如何设置 MTLVertexDescriptor 和带有属性的着色器结构,以便它处理来自我的结构的“打包”数据?
非常感谢。
c# - 为什么渲染的对象会出现扭曲?
尝试显示具有 3 个顶点的红色三角形时出现扭曲的红色三角形(在 (-0.5,-0.5) (0.5,-0.5) (0,0.5))我正在使用此代码传递给着色器
顶点由 2 个分别代表位置和颜色的 Vector4 组成,我尝试过调试它并且值看起来很好,因为有 2 个属性,位置和颜色,循环运行 2 次,
第一次迭代:index = 0,count = 4,type = float,normalized = false,stride = 16,pointer = 0
第二次迭代:index = 1,count = 4,type = float,normalized = false,stride = 16,pointer = 16
为什么这在图像中看起来像?
编辑:
顶点着色器
片段着色器
顶点
r - 分解图的每个顶点的不同顶点形状
我有一个非常大的二分网络模型,它是从 500 万行数据集中创建的。我分解了我的网络模型,因为我无法绘制这种大小的图表。现在我需要的是一张一张地绘制分解图形。没有问题。但是我想根据每个节点的属性来绘制带有形状的图形。例如,我想要一个正方形代表我的图表 G 上的“A”属性,而一个三角形代表“B”属性。除此之外,我想按属性添加顶点标签。这是我在创建二分 G 及其工作后绘制图的第一个组件的代码:
我尝试了这样的方法来添加标签并根据图形属性更改顶点形状,但它不起作用:
有没有人可以帮助我,我被卡住了。太感谢了!