gpt4 book ai didi

opengl - 关于 glVertexAttrib 的困惑...函数

转载 作者:行者123 更新时间:2023-12-02 03:31:34 26 4
gpt4 key购买 nike

经过大量搜索,我仍然对 glVertexAttrib... 函数(glVertexAttrib1dglVertexAttrib1f 等)感到困惑做什么以及他们的目的是什么。

我目前的阅读理解this questiondocumentation是他们的目的是以某种方式将顶点属性设置为常量(即不使用数组缓冲区)。但该文档还讨论了它们如何与定义如下的“通用顶点属性”交互:

Generic attributes are defined as four-component values that are organized into an array. The first entry of this array is numbered 0, and the size of the array is specified by the implementation-dependent constant GL_MAX_VERTEX_ATTRIBS. Individual elements of this array can be modified with a glVertexAttrib call that specifies the index of the element to be modified and a value for that element.

它说它们都是“四分量值”,但是完全有可能比顶点属性中的分量更多或更少。

这句话到底是什么意思?这只适用于 vec4 类型吗? “通用顶点属性”的索引是什么?一个清晰的解释可能是我真正需要的。

最佳答案

在 OpenGL 中,一个顶点被指定为一组顶点属性。随着可编程管道的出现,您有责任编写自己的顶点处理功能。顶点着色器确实处理一个顶点,并将该特定顶点的属性作为输入。

这些顶点属性称为通用顶点属性,因为它们的含义完全由您作为应用程序程序员定义(与传统的固定功能管道相反,其中属性集完全由应用程序定义) GL)。

OpenGL 规范要求实现者支持至少 16 种不同的顶点属性。因此,每个顶点属性都可以通过其 索引 从 0 到 15 来标识(或者您的实现允许的任何限制,请参阅 glGet(GL_MAX_VERTEX_ATTRIBS,...))。

顶点属性在概念上被视为四维向量。当您在着色器中使用小于 vec4 时,其他元素将被忽略。如果您指定少于 4 个元素,则向量始终填充到 (0,0,0,1),这对 RGBA 颜色向量以及作为齐次顶点坐标。

虽然您可以声明mat 类型的顶点属性,但这只会映射到多个连续的顶点属性索引。

顶点属性数据可以来自顶点数组(现在,它们需要位于顶点缓冲区对象中,可能直接位于 VRAM 中,在遗留 GL 中,它们也可以来自普通客户端地址空间)或来自该属性的当前值。您可以通过 glEnableVertexAttribArray 启用从属性数组中获取。如果启用了您在顶点着色器中访问的特定属性的顶点数组,GPU 将获取第 i 个元素在处理顶点 i 时从那个 arry 开始。对于您访问的所有其他属性,您将获得该数组的当前值

可以通过 glVertexAttrib[1234]* 设置当前值 GL函数族。它们在绘图调用期间无法更改,因此它们在整个绘图调用期间保持不变 - 就像统一变量一样。

值得注意的一件重要事情是,默认情况下,顶点属性始终是 float ,您必须声明 in float/vec2/vec3/vec4 在顶点着色器中访问它们。使用例如 glVertexAttrib4ubv 或使用 GL_UNISGNED_BYTE 作为 glVertexAttribPointertype 参数设置当前值不会改变这一点。数据将自动转换为 float 。

如今,GL 确实支持另外两种属性数据类型:32 位整数和 64 位 double 浮点值。您必须将它们声明为 int/ivec*uint/uvec*double/dvec* 分别在着色器中,并且在设置数组指针或当前值时必须使用完全独立的函数:glVertexAttribIPointerglVertexAttribI* 用于有符号/无符号整数和glVertexAttribLPointerglVertexAttribL* 用于 double (“长 float ”)。

关于opengl - 关于 glVertexAttrib 的困惑...函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51721058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com