OpenGL ES:顶点结构是否需要 x、y 和 z?
OpenGL ES: Do vertex structs need x, y, AND z?
这可能是一个愚蠢的问题,但我一直在想 - OpenGL 中的顶点结构是否需要具有 x、y 和 z?我在 2D 中绘图,但我看到的所有教程似乎在其结构中都有一个 z 变量,即使它始终为 0。这不会减慢渲染速度吗?
此外,他们似乎总是有 r、g、b 和 a 作为颜色变量,但我不需要 alpha,因为它在我的项目中始终为 1。我真的需要每次都说它是 1 吗?
我只是想知道,因为 glVertexAttribPointer 允许您将第二个参数设置为任何值,我尝试将其设置为 2,因为我只使用 x 和 y,而且它起作用了。
是的,总是需要一个 Z,它是一个 3D 渲染器,当你做 2D 的东西时,你只是在利用 3D 渲染器来真正地做 2D(使用正交投影而不是透视),你仍然可以使用 Z 来使某些对象位于其他对象之上,这很有用。据我所知,着色器中的 gl_Position 变量实际上是一个 vec4,因此它将具有 Z 和 W 分量,我认为如果您使用的是 vec2,那么只有 X 和 Y,Z 和 W 将获取默认值,否则您将不得不在着色器中将其转换为 vec4,我不记得了。
如果您删除了 z,您不会注意到改进,因为 OpenGL 仍然会进行 3D 渲染,尽管您只是将它用于 2D 渲染。然而,你获得了记忆。因此,您可以删除 z 并让 glVertexAttribPointer
的第二个参数如您所说的那样设置为 2,但请注意您将如何在着色器中操作向量。
这可能被认为是过度优化,但如果您愿意,您可以禁用深度渲染,这样对象将按照它们在设置期间调用 glDisable (GL_DEPTH_TEST)
渲染的顺序从后向前渲染。 In openGL, how can you get items to draw back to front?
对于非透明图像,您可以将其作为GL_RGB类型加载到GPU:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, each.w, each.h, 0, GL_RGB, GL_UNSIGNED_BYTE, each.image)
来自 spec 第 2.8 节:
If size is one then the x component of the attribute is specified by the array; the y, z, and w components are implicitly set to zero, zero, and one, respectively. If size is two then the x and y components of the attribute are specified by the array; the z , and w components are implicitly set to zero, and one, respectively. If size is three then x, y, and z are specified, and w is implicitly set to one. If size is four then all components are specified.
因此,如果您没有为 2D 顶点定义 z 或 w。顶点组装器自动用 z=0,w=1 填充它们。您的代码安全且正确。
RGBA 与 XYZW 相同,因此假设您希望 alpha 为 1,则不必为颜色分量指定 alpha。
在性能方面,您通常应该通过使用较小的顶点组件来获得胜利,因为需要移动和复制到 GPU 的数据较少。我预计任何性能提升都是微不足道的,而且可能无法衡量。
一个例外是,如果您从一个顶点上削减几个字节并将其从缓存友好的每个顶点 16 字节减少到每个顶点 12 字节,您可能会稍微降低性能,因为 8、16、32就内存访问而言,字节大小有点神奇。同样,这里的任何性能损失都是微小的,所以我不会让它给您带来麻烦。
这可能是一个愚蠢的问题,但我一直在想 - OpenGL 中的顶点结构是否需要具有 x、y 和 z?我在 2D 中绘图,但我看到的所有教程似乎在其结构中都有一个 z 变量,即使它始终为 0。这不会减慢渲染速度吗?
此外,他们似乎总是有 r、g、b 和 a 作为颜色变量,但我不需要 alpha,因为它在我的项目中始终为 1。我真的需要每次都说它是 1 吗?
我只是想知道,因为 glVertexAttribPointer 允许您将第二个参数设置为任何值,我尝试将其设置为 2,因为我只使用 x 和 y,而且它起作用了。
是的,总是需要一个 Z,它是一个 3D 渲染器,当你做 2D 的东西时,你只是在利用 3D 渲染器来真正地做 2D(使用正交投影而不是透视),你仍然可以使用 Z 来使某些对象位于其他对象之上,这很有用。据我所知,着色器中的 gl_Position 变量实际上是一个 vec4,因此它将具有 Z 和 W 分量,我认为如果您使用的是 vec2,那么只有 X 和 Y,Z 和 W 将获取默认值,否则您将不得不在着色器中将其转换为 vec4,我不记得了。
如果您删除了 z,您不会注意到改进,因为 OpenGL 仍然会进行 3D 渲染,尽管您只是将它用于 2D 渲染。然而,你获得了记忆。因此,您可以删除 z 并让 glVertexAttribPointer
的第二个参数如您所说的那样设置为 2,但请注意您将如何在着色器中操作向量。
这可能被认为是过度优化,但如果您愿意,您可以禁用深度渲染,这样对象将按照它们在设置期间调用 glDisable (GL_DEPTH_TEST)
渲染的顺序从后向前渲染。 In openGL, how can you get items to draw back to front?
对于非透明图像,您可以将其作为GL_RGB类型加载到GPU:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, each.w, each.h, 0, GL_RGB, GL_UNSIGNED_BYTE, each.image)
来自 spec 第 2.8 节:
If size is one then the x component of the attribute is specified by the array; the y, z, and w components are implicitly set to zero, zero, and one, respectively. If size is two then the x and y components of the attribute are specified by the array; the z , and w components are implicitly set to zero, and one, respectively. If size is three then x, y, and z are specified, and w is implicitly set to one. If size is four then all components are specified.
因此,如果您没有为 2D 顶点定义 z 或 w。顶点组装器自动用 z=0,w=1 填充它们。您的代码安全且正确。
RGBA 与 XYZW 相同,因此假设您希望 alpha 为 1,则不必为颜色分量指定 alpha。
在性能方面,您通常应该通过使用较小的顶点组件来获得胜利,因为需要移动和复制到 GPU 的数据较少。我预计任何性能提升都是微不足道的,而且可能无法衡量。
一个例外是,如果您从一个顶点上削减几个字节并将其从缓存友好的每个顶点 16 字节减少到每个顶点 12 字节,您可能会稍微降低性能,因为 8、16、32就内存访问而言,字节大小有点神奇。同样,这里的任何性能损失都是微小的,所以我不会让它给您带来麻烦。