Fast Level Rendering(need help)

Started by
10 comments, last by Bow_vernon 13 years, 6 months ago
Hello Im making a map editor for my 3D RPG Engine, but I encounter several problem when rendering the level.

1st, Most of the time, I only got ~65 FPS, for ~6740 Tris
2nd, My game level consist of "layers", that is, one polygon could be rendered many times to achieve the final result, thus involving lots of blending and state changes
3rd, It uses many different textures, so texture switches always happen all the time

I dunno how to speed up the code, Well I tried several solution

- I use octree
- I use display list ( I made a program that compares different rendering technique, eg vertex array, VBO, Display List. Display list won most of the time)

CAn you tell me what's wrong??Oh I'll post a screenshot next time I check this thread...

Btw, my PC Is CPU limited, vut I guess it should handle thousands triangles well.

And one question. Why DirectX based application always run faster than OpenGL Based one (It happens in my PC)
Advertisement
This may be a stupid question,but did you actually tried to draw 50-100k triangles?
Did the rendering speed decrease?

It sounds like you could have v-sync turned on.
I concur with the vsync guess; it may also be the case that you have NVIDIA hardware which I have seen not supporting application controlled vsync in OpenGL apps these days. So to switch vsync off you'll need to use the NVIDIA control panel instead.

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

Well, Sorry I was busy that I couldnt reply the messages. well, I turned of vsync, but damn, when I draw nothing, it gets ~4232 FPS, when I drew 32768 non textured triangles, I got ~576 FPS. BUT When I finally enable my "splatting" terrain technique, it dropped to ~120 FPS. It's just the level mesh (terrain). You could imagine what'll happen if I add something more to it....a SLUGGISH Game, perhaps....well this is the screenshot...it shows a crappy app that renders about 5000 tris in ONLY 74 FPS with VSync turned off.......WTF

Crappy OGL App
Quote:Original post by Bow_vernon
it shows a crappy app that renders about 5000 tris in ONLY 74 FPS with VSync turned off.......WTF
Frames per second is a poor measure of performance to start with. Performance also rarely scales linearly: that you can render 5k triangles at 74 fps doesn't necessarily mean that 100k triangles will run at 3.5 fps.

Before we go further, what GPU are you running, and are your graphics drivers up to date?

Tristam MacDonald. Ex-BigTech Software Engineer. Future farmer. [https://trist.am]

It might be time to wrap timers around all aspects of your engines processes e.g.

Main Loop
Move objects
Draw scene - each pass too.
Physics
Effects

blah blah..

Find your bottlenecks.

Cheers

Lee

Code is Life
C/C++, ObjC Programmer, 3D Artist, Media Production

Website : www.leestripp.com
Skype : lee.stripp@bigpond.com
Gmail : leestripp@gmail.com

How are you performing your texture-splatting code? You mention rendering the triangles multiple times which can be slow. Instead of rendering the triangles multiple times, use multi-texturing instead. What you'll want to do, is render the your terrain once, and give your vertices a set of UV coordinates per texture applied to your terrain. You'll generate these texture coordinates the same was you did with your current method, only this time, you're storing the UV values in your vertex format.

How are you storing your vertex data anyway? Are you using immediate mode (glVertex3f, etc), or are you using vertex buffers (glVertexPointer, etc). Using vertex buffers can be a lot more efficient too. Especially

To alter the opacity of a texture applied to your vertex, I would do this in a shader. Instead of passing in 2D UV coordinates for texture coordinates, pass in a 3D vector: UVa. The "a" is your texture's alpha component. When your fragment shader samples the pixel's color from the texture, scale the final color by that alpha component. The alpha component will interpolate just like your UV components will when it gets passed to the fragment shader.

Also, when texture-splatting, you aren't generating new maps every time frame, right? I've seen methods online that require requires the visible sections to generate a combination texture that copies all the textures, scales their alpha value, then multiplies all the texture data together to get the final result. You could also do this method offline too (as it should), but you'll need a lot more memory which is why real-time generation is suggested... I'll have to dig up those articles sometime.
Quote:Original post by mixmaster
It might be time to wrap timers around all aspects of your engines processes e.g.

Main Loop
Move objects
Draw scene - each pass too.
Physics
Effects

blah blah..

Find your bottlenecks.
Or, you know, use a profiler?

Tristam MacDonald. Ex-BigTech Software Engineer. Future farmer. [https://trist.am]

Sorry guys, I couldnt reply sooner (damn busy, huff). Well, Im running a GeForce 7300GT and I use immediate mode (Compiled in display list), and I dont use shaders.

@Vincent : No, I dont use that technique (My maps arent that big anyway). My splatting techniques works as described by charles bloom. Basically, for each "layer" (other than the base layer), I assign an "alphamap" (it's a greyscale image that contains alpha information.

Render Stages:
-Turn off blending, draw base layer.
-Enable Blending
--For each layer, set texture0 as texture map and texture1 as the alphamap
--Set the texture combiner to use the texture1 as the alpha value.
--Draw the layer
-Turn off blending

Like I said, I use display list because it runs pretty fast in my PC(even faster than VBO). I dont use VBO or vertex array because(other than they're slower, they need the "complete" data for each vertex. In my app, each vertex only has a reference to other vertex data: that is, each vertex only store its reference to a normal)

BTW, I'll do profiling as soon as I have time. Thx guys, I'll be back later when I still got some pain in the arse..
Well to me it sounds that you are fill rate capped due to texture splatting. If this is correct VBOs or DL won't increase performance. Depending on your texturing technique there might be some way to help on this issue, try checking a combination of PBO/TBO/FBO (last one is for render to texture only). I will check this post later to see your profiler analysis.

This topic is closed to new replies.

Advertisement