带有缓冲对象和着色器的精灵表


9

用着色器和缓冲区处理子画面的“最佳”方法是什么?在即时模式下,绘制精灵时修改其texcoords很容易,但是我不知道如何使用现代的opengl来实现。我应该将所有texcoords存储在缓冲区中并为每个sprite更改指针,还是有更好的方法?

Answers:


11

您总是可以使looong缓冲区“ vertex; texcoord”重复。只需使用索引即可。它可能最简单,并且与您所知道的类似。

如果要节省一些内存。有一个非常好的解决方案,那就是在缓冲区中将一个精灵与texcoords结合在一起,创建UVs转换矩阵,并将其发送到您的着色器,然后将其与texcoords相乘(在顶点着色器中)。

如果您对此不满意,则不必自己创建矩阵。您可以只使用常规GL函数,而不可以读取具有glGetFloatv函数的矩阵。像这样:

glGetFloatv (GL_MODELVIEW_MATRIX ,&g_TexCoordMat);

我创建了图像以更好地描述它。可以将glTranslate和glScale视为它们只是随UV空间移动。

雪碧uvs

如果您不知道如何将矩阵发送到着色器,我可以与您共享一些代码。

编辑:添加图片
(我使用过的spritesheet的源:funorb.com


哇谢谢!完美的答案。我真的很喜欢这种解决方案,下班后我会尽快进行研究。:-)如果我被卡住了,我会再问您一些问题。
uggwar

据我所知,这将为每个精灵生成一个绘制调用。有没有一种方法可以批处理这些精灵,从而实现更流畅的实现?
uggwar'3

@uggwar实例化图纸?
Notabene 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.