这可能是一个愚蠢的问题,但我一直想知道——OpenGL 中的顶点结构是否需要有 x、y 和 z?我在 2D 中绘制,但我见过的所有教程似乎在其结构中都有 az 变量,即使它总是 0。这不会减慢渲染速度吗?
此外,它们似乎总是有 r、g、b 和 a 作为颜色变量,但我不需要 alpha,因为我的项目始终为 1。我真的需要每次都说它是1吗?
我只是想知道 glVertexAttribPointer 允许您将第二个参数设置为任何值,并且我尝试将其设置为 2,因为我只使用 x 和 y,并且它有效。
这可能是一个愚蠢的问题,但我一直想知道——OpenGL 中的顶点结构是否需要有 x、y 和 z?我在 2D 中绘制,但我见过的所有教程似乎在其结构中都有 az 变量,即使它总是 0。这不会减慢渲染速度吗?
此外,它们似乎总是有 r、g、b 和 a 作为颜色变量,但我不需要 alpha,因为我的项目始终为 1。我真的需要每次都说它是1吗?
我只是想知道 glVertexAttribPointer 允许您将第二个参数设置为任何值,并且我尝试将其设置为 2,因为我只使用 x 和 y,并且它有效。
从规范第 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.
So if you don't define z or w for your 2D vertices. The vertex assembler automatically fills them with z=0,w=1. Your code is safe and correct.
RGBA is the same as XYZW, so you don't have to specify alpha for colour components either assuming you want alpha to be 1.
Performance-wise you should generally expect a win by using smaller vertex components because less data has to be moved around and copied to the GPU. I would expect any performance gain to be tiny and probably unmeasurable.
One exception is that if you shave a few bytes off a vertex and reduce it say from a nice cache friendly 16-bytes per vertex to 12-bytes per vertex, you might reduce performance slightly because 8, 16, 32 byte sizes are a bit of a magic number as far as memory accesses go. Again, any performance loss here will be minute, so I wouldn't let it trouble you.
如果您删除了 z,您不会注意到改进,因为 OpenGL 仍然会进行 3D 渲染,尽管您只是将它用于 2D 渲染。但是,您会获得记忆。因此,您可以删除 z 并将第二个参数glVertexAttribPointer
设为 2,如您所说,但要注意如何在着色器中操作向量。
这可能被认为是过度优化,但如果您愿意,您可以禁用深度渲染,以便对象将按照glDisable (GL_DEPTH_TEST)
设置期间调用渲染的顺序重新渲染。在 openGL 中,如何让项目向后拉到前面?
对于非透明图像,您可以将其作为 GL_RGB 类型加载到 GPU:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, each.w, each.h, 0, GL_RGB, GL_UNSIGNED_BYTE, each.image)
是的,总是需要一个 Z,它是一个 3D 渲染器,当你在做 2D 的东西时,你只是在利用 3D 渲染器来做 2D(使用正交投影而不是透视),你仍然可以使用 Z 来使某些对象处于打开状态其他有用的。据我所知,着色器中的 gl_Position 变量实际上是一个 vec4,因此它将具有 Z 和 W 分量,我认为如果您使用的是 vec2,那么只有 X 和 Y,Z 和 W 将获得默认值或您必须在着色器中将其转换为 vec4,我不记得了。