Re: render particle

Dave Astle <[email protected]> Tue, 07 Mar 2006 21:59:24 -0800
Newsgroups gmane.games.devel.opengl
Organization Fat City Network Services, San Diego, California
Message-ID <[email protected]>
You don't need to do anything like that in the fragment shader. In the 
vertex shader, you can write to a value (gl_pointSize in GLSL, 
result.pointsize in ARB_vertex_program) that sets the size of the point 
in pixels, up to whatever the implementation max is. You could just pass 
through the per-vertex attribute that you specified in the generic 
stream, or you could attenuate that value, or whatever.

Dave

Malcolm Bechard wrote:
> Hi Dave,
> 	Can you (or someone else) elaborate on this? If I pass a point size
> into the vertex shader using a generic attribute when drawing POINT_SPRITES,
> what is the best way to use this value to scale the resulting sprite? I was
> thinking of using it to scale the texture coordinates in the pixel shader to
> shrink the texture, but the problem is I can't grow the sprite beyond the
> current value of POINT_SIZE. Is there some way to control the sprite size by
> doing something in the vertex shader?
> 
> Thanks
> 
> Malcolm
> 
> 
> -----Original Message-----
> Astle
> Sent: Tuesday, March 07, 2006 8:39 PM
> To: Multiple recipients of list OPENGL-GAMEDEV-L
> 
> Other than distance-based attenuation, there isn't a way to change the 
> point size within a single draw call in the fixed function pipeline*, 
> but with a vertex shader, you can easily use one of the generic 
> attributes to set an arbitrary per-point size value.
> 
> With a shader, you should be able to easily render a large number of 
> particles in a single call.
> 
> (* - in desktop GL, anyway. OpenGL ES includes a fixed-function 
> extension that does exactly this).
> 
> Dave Astle
> 
> -------------------------------------------------------------------------
> Staff Engineer, ATI Research
> Executive Producer, GameDev.net, LLC: http://www.gamedev.net/
> Four-time author, Course Technology PTR
> -------------------------------------------------------------------------
> 
> Balogh Péter wrote:
> 
>>My main concern is the state changes, if I have to use n sizes for the 
>>system. Because what if I have 100 particles, all with different sizes. 
>>As far as I know, I can't render 100 particles with different sizes 
>>unless for every particle I call
>>
>>glPointParameterfARB( GL_POINT_SIZE_MAX_ARB, fAdSize);
>>glBegin(GL_POINTS);
>>glColor4fv((float *)&ptmp->color);
>>glVertex3fv((float *)&ptmp->pos);
>>glEnd();
>>
>>wich seems pretty expensive, considering the alternative that I could 
>>precalculate the 100 particles to 400 vertices, while rendering huge 
>>meshes(while the card is rendering), and after the meshes I simlpy 
>>render the 400 vertices as a vertexarray.
>>
>>Does the POINT_SPRITE method stalls the gpu? Is there a way, to batch 
>>the different size/color attributes with positions, and render with a 
>>small number of render calls like huge triangle meshes? I don't really 
>>have bus or fillrate or cpu limitation yet (lack of final concept of 
>>visual requirements). I'm trying to find and implement the overall 
>>cheapest particle system for few 1000 particles.
>>
>>All help appreciated!
>>
>>Peter Balogh
>>
>>Kent Quirk wrote:
>>
>>
>>>Andras has good advice.
>>>
>>>But if you're reluctant to use OpenGL sprites because you want to use 
>>>OpenGL 1.1, then you could also consider rendering each particle as a 
>>>single billboarded (always facing the camera) triangle.
>>>
>>>You can render them with alpha on and use a texture with a circular 
>>>gradient (solid in the middle, transparent at the edges). If you use 
>>>the "Flyweight" pattern you can treat all the particles in one as 
>>>having common attributes and minimize state changes.
>>>
>>>It's old technology, but it's been proven in many games. And if your 
>>>target is that low, you probably want to consider it.
>>>
>>>   Kent
>>>
>>>
>>>
>>>
>>>Andras Balogh wrote:
>>>
>>>
>>>>First, you'll probably be limited by fillrate way before you'll be 
>>>>limited  by vertex transforms. But even if not, next you'll be 
>>>>limited by bus  bandwidth, and points need 4 times less bandwidth 
>>>>than quads. Finally, the  only time you might want to micro-optimize 
>>>>like this, is when you're  competing with johnc, but then you 
>>>>probably wouldn't need our advice ;)
>>>>
>>>>Trust me, getting rid of camera transformation is not an 
>>>>optimization.  There's so much more going on that this won't make the 
>>>>slightest  difference! I'm sure you've heard this before: "Premature 
>>>>optimization is  the root of all evil". Always go with the simplest 
>>>>solution, and then  optimize the bottleneck. It makes no sense to 
>>>>optimize something that is  not even the bottleneck! You'll end up 
>>>>with more complicated, less  flexible and probably slower code.
>>>>
>>>>Of course, sprites have their problems, like HW dependent size limit 
>>>>(most  cards max out at 64x64 pixels), but that's not a speed issue, 
>>>>but a  feature issue.
>>>>
>>>>
>>>>Andras
>>>
>>>
>>>
>>>
>>>----- FAQ and OpenGL Resources at:
>>> http://www.geocities.com/SiliconValley/Hills/9956/OpenGL
>>>
>>
>>----- FAQ and OpenGL Resources at:
>> http://www.geocities.com/SiliconValley/Hills/9956/OpenGL
>>
> 
> 
> 
> ----- 
> FAQ and OpenGL Resources at:
>   http://www.geocities.com/SiliconValley/Hills/9956/OpenGL
> 

----- 
FAQ and OpenGL Resources at:
  http://www.geocities.com/SiliconValley/Hills/9956/OpenGL

-- 
Author: Dave Astle
  INET: [email protected]

Fat City Hosting, San Diego, California -- http://www.fatcity.com
---------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [email protected] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB OPENGL-GAMEDEV-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).