I wasted some time trying to make something complicated, and then
decided to first try the following:
I have a MultiTextureEnable group which sets up the texture parameters
and enables the textures.
Then to build the batch, I sort the faces by surfacetexture. Then for
each face, when the surfacetexture changes, I make a new
SurfaceTextureBindGroup with the MultiTextureEnable group as the
parent. For each lightmap texture within that surfacetexture group, I
use LightMapSurfaceTextureBindGroup in the batch.add.
Doing the above reduces the state changes considerably - my viewer
runs at 34 fps on the same level it was getting 2 (if it was lucky!).
I am going to try packing the lightmap textures. However, I think I
can't pack the surfacetextures, as they are repeating textures.
Thanks for the feedback/advice.
Here are my classes for the opengl state setting:
class MultiTextureEnableGroup(pyglet.graphics.Group):
def set_state(self):
glActiveTexture(GL_TEXTURE0)
glEnable(GL_TEXTURE_2D)
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE )
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_LINEAR)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
glActiveTexture(GL_TEXTURE1)
glEnable(GL_TEXTURE_2D)
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE )
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_LINEAR)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
def unset_state(self):
glActiveTexture(GL_TEXTURE1)
glDisable(GL_TEXTURE_2D)
glActiveTexture(GL_TEXTURE0)
glDisable(GL_TEXTURE_2D)
class SurfaceTextureBindGroup(pyglet.graphics.Group):
def __init__(self, texture):
super(SurfaceTextureBindGroup,
self).__init__(parent=texture_enable_group)
assert texture.target == GL_TEXTURE_2D
self.texture = texture
def set_state(self):
glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, self.texture.id)
# No unset_state method required.
def __eq__(self, other):
return (self.__class__ is other.__class__ and
self.texture.target == other.texture.target and
self.texture.id == other.texture.id and
self.parent == other.parent)
def __hash__(self):
return hash((self.texture.target, self.texture.id))
class LightmapTextureBindGroup(pyglet.graphics.Group):
def __init__(self, texture, tparent):
super(LightmapTextureBindGroup, self).__init__(parent=tparent)
assert texture.target == GL_TEXTURE_2D
self.texture = texture
def set_state(self):
glActiveTexture(GL_TEXTURE1)
glBindTexture(GL_TEXTURE_2D, self.texture.id)
# No unset_state method required.
def __eq__(self, other):
return (self.__class__ is other.__class__ and
self.texture.target == other.texture.target and
self.texture.id == other.texture.id and
self.parent == other.parent)
def __hash__(self):
return hash((self.texture.target, self.texture.id))
On Aug 21, 7:48 pm, "Alex Holkner" <[EMAIL PROTECTED]> wrote:
> On 8/22/08, Alex Holkner <[EMAIL PROTECTED]> wrote:
>
>
>
> > On 8/22/08, Price Hall <[EMAIL PROTECTED]> wrote:
> > > Here's a screenshot of my quake3 map viewer with
> > > multitexturing....obviously not optimized =)
>
> > > It works, however a significant challenge will be to make it
> > > reasonably fast. With surface textures alone, or lightmap textures
> > > alone, it reaches 250 fps. My code right now is worst-case as far as
> > > numbers of state changes.
>
> > > Quake maps have surface textures and lightmap textures. The surface
> > > textures are various sizes, and some use texture coords outside 0.0 -
> > > 1.0.. The lightmap textures are all 128 x 128, with texture coords
> > > between 0.0 and 1.0. Textures will have to be bound much more
> > > frequently than with surface textures alone. There is very little
> > > grouping that can be done strictly by the combination of
> > > surface/lightmap textures. I'm trying to figure out a way I could
> > > form groups based on whichever is changing the least, say sort them
> > > out, set one texture and then have sub-groups for the various other
> > > textures combined with that one.
>
> > If you're loading all the textures at startup anyway, it might also be
> > worth packing the textures into larger atlases. e.g., within one
> > 1024x1024 texture you could fit 64 lightmap textures (every device
> > I've seen will support a texture of those dimensions; larger and you
> > may have issues).
>
> Oh, and, very impressive work BTW, looks great!
>
> Alex.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"pyglet-users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/pyglet-users?hl=en
-~----------~----~----~----~------~----~------~--~---