问题标签 [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.
opengl - 你能判断一个顶点属性是否从顶点着色器中启用吗?
我想知道是否有办法判断顶点属性是否从顶点着色器中启用?我知道如果顶点属性被禁用,所有值都将被视为 0.0,所以我可以进行如下测试:
但这对于属性启用并且值只是设置为0的情况存在明显的问题(它将被视为已禁用)!
另一种解决方案是只使用一个统一变量来说明是否使用该属性,但我想知道 GLSL 中是否有任何内置的东西可以做到这一点?
c++ - 带纹理的 glDrawElement
我无法让我的 3D 模型纹理化,我只是深入研究 3D 模型,因为我一直在使用基本原语进行测试,并且一直在处理更多引擎特定的代码。但是我在使用 glDrawElements 函数时遇到了问题,我知道我的纹理已正确加载,因为我能够将其绘制到四边形(请注意注释中的 glBegin)。但是,当使用 glDrawElements 时,我没有绘制纹理。它确实显示了部分纹理的颜色(黄色),当我删除纹理代码时,它会将 3D 模型返回到最后设置的颜色,所以它正在做一些事情。我在想这可能与我的 glVertexAttributePointer 有关,我得到了这些函数的作用。
我的 VertexPTN 类只是位置、纹理坐标和法线的容器。所以我假设我的向量在班级中的定位是这样的;Vector3f、Vector2f、Vector3f,我会将 glVertexAttributePointer 的最后一个参数设置为 0、12、20。
对我遗漏的任何东西有任何误解吗?我真的不是 openGL 专家,但我确实了解相当多的设置和基本渲染。是什么导致我的纹理不渲染到我的网格,未设置的 GL 状态?
opengl - glDrawElements 中如何处理索引数据?
我知道当 glDrawElements 被调用时,它使用索引缓冲区来确定以什么顺序绘制哪些顶点。我的问题是这些索引如何应用于纹理、法线和颜色属性。是否可以为每个顶点应该使用的纹理坐标和法线设置另一个索引数组。或者我是否必须创建法线和纹理坐标缓冲区,以便它们与正在绘制的顶点对齐?
opengl - 理解 opengl 实例化数组
给定
FaceGroup
我通过循环遍历cubeIndices
from中的每个索引start_index
来渲染集合中的每一个,start_index + length
如下所示:
...这给了我正确的结果。现在我想使用实例化数组渲染同样的东西。我的推理告诉我,下面的代码等价于上面的循环:
但似乎只渲染了每组人脸中的第一个(*试探,我可能错了)。我究竟做错了什么?
opengl - 如何使这个简单的 OpenGL 代码(在“宽松”3.3 和 4.2 配置文件中工作)在严格的 3.2 和 4.2 核心配置文件中工作?
我注意到一些 3D 代码不会在严格的核心配置文件中呈现,但在“正常”(未明确要求仅作为核心)配置文件上下文中很好。为了隔离这个问题,我编写了最小最简单的 OpenGL 程序,只绘制一个三角形和一个矩形:
我已将 OpenGL 程序作为 Gist 发布在这里。
将useStrictCoreProfile变量设置为 false 时,程序不会向控制台输出任何错误消息,并根据上面的屏幕截图在 Intel HD OpenGL 3.3 和带有 OpenGL 4.2 的 GeForce 上绘制一个四边形和一个三角形。
但是,将useStrictCoreProfile设置为 true 时,它会清除背景颜色但不会绘制 tri & quad,控制台输出是这样的:
...如果请求 4.2 严格的核心配置文件而不是 3.2,同样的问题。适用于 3 个不同的 nvidia GPU,所以我认为我没有正确遵守严格的核心配置文件。我做错了什么,我该如何解决这个问题?
注意,你不会在上面的 Gist 中找到glEnableVertexAttribArray调用,因为它在我正在导入的 glutil 包中——但这确实被称为 gist 的compileShaders()函数的最后一步。
opengl - 为什么禁用顶点属性数组零时OpenGL绘图失败?
我在让我的顶点着色器在 ATI 驱动程序上的 OpenGL 3.3 核心下运行时遇到了极大的麻烦:
我使用 glVertexAttrib4f 来指定颜色属性,并关闭属性数组。根据 3.3 核心规范的第 33 页,应该可以:
如果与顶点着色器所需的通用属性对应的数组未启用,则从当前通用属性状态中获取相应的元素(参见第 2.7 节)。
但是(大多数情况下,取决于配置文件和驱动程序)如果我访问禁用的颜色属性,着色器要么根本没有运行,要么使用黑色。用常量替换它可以运行。
大量搜索产生了这个关于 WebGL 的提示页面,其中有以下内容:
始终启用顶点属性 0 数组。如果您在禁用顶点属性 0 数组的情况下进行绘制,则在桌面 OpenGL(例如 Mac OSX)上运行时,您将强制浏览器进行复杂的模拟。这是因为在桌面 OpenGL 中,如果顶点属性 0 未启用数组,则不会绘制任何内容。您可以使用 bindAttribLocation() 强制顶点属性使用位置 0,并使用 enableVertexAttribArray() 使其启用数组。
果然,不仅颜色属性被分配给索引零,而且如果我将一个不同的、启用数组的属性强制绑定为零,代码就会运行并产生正确的颜色。
我在任何地方都找不到任何其他提及此规则的内容,当然也不是在 ATI 硬件上。有谁知道这条规则来自哪里?或者这是 Mozilla 人员注意到并警告的实现中的错误?
java - 无法创建用于在具有 4 个属性的图中添加顶点的函数/方法
我无法创建一个函数/方法来在 Java 中添加具有 4 个属性的顶点,即年龄、名称、maritalStatus 和索引,其中新顶点需要插入到指定的索引中。
有人可以指导我如何去做吗?
我如何存储这些详细信息;以邻接矩阵、邻接列表或数组列表的形式?
opengl - 在 glVertexAttribPointer() 中使用 GL_INT_2_10_10_10_REV
谁能告诉我我们究竟如何使用 GL_INT_2_10_10_10_REV 作为 glVertexAttribPointer() 中的类型参数?我正在尝试使用这种类型传递颜色值。还有这种类型的“REV”后缀有什么意义?它是否需要在着色器中进行任何特殊处理?
我的代码如下:
着色器是:顶点着色器 -
片段着色器 -
程序对象也被验证。那里没有问题。此代码在 AMD 卡上运行良好,但在 NVidia 上失败。失败意味着我在 glDrawArrays() 调用中获得了 NULL 指针访问权限。
c++ - glDrawElements crashes when not using certain vertex attributes
In my OpenGL program I have two shaders. One renders with textures, and the other renders just solid colors. After compiling and linking a shader, I enable a texture coordinate vertex attribute array depending on weather or not the shader contains the attribute.
If I am rendering an item
that is textured, each element in verts
consists of 5 values (x,y,z,tx,ty), but if the item isn't textures, each element in verts
contains only 3 values (x,y,z).
Here is the problem: When the first item
rendered in the GL context does not have a texture, glDrawElements
segfaults! However, if the first item rendered does have a texture, it works fine, and any untextured items after the textured one work fine (that is, until a new context is created).
This chunk of code renders an item
Here is the function seen above that sets the shader.
As far as I know, this problem is not apparent on Intel Integrated Graphics, which seem to be quite lenient.
Edit: If it is useful to know, I am using GLFW and GLEW.
c++ - 自动顶点属性分配是否保证顺序正确?
当使用在着色器代码中指定顶点属性位置时,layout(location = ...)
我不需要glGetAttribLocation
在我的 C++ 程序中使用获取位置。
如果我既没有使用布局限定符在着色器中定义位置,也没有在我的 C++ 程序中获取它们,它们会被自动分配。问题是关于这个自动分配。顺序是否等于着色器代码中的定义顺序?
例如,在第一个着色器代码中,位置是否保证与第二个着色器代码中的位置相同?
此外,相同的规则是否适用于片段着色器输出?现在我glBindFragDataLocation
用来取它们。