Sign in to follow this  
Aztral

Texture Lookup Cost?

Recommended Posts

[font="arial, verdana, tahoma, sans-serif"][size="2"]I've been working on Terrain rendering for a bit and I wanted to ask my professor today a few questions so I took the project in to show to him. Unfortunately I hadn't run it on my laptop before and much to my dismay the frame rate had dropped from 90 - 100 on my desktop to about 7 on my laptop when rendering similar scenes. For reference my desktop has a Radeon 5970 and my laptop has a Radeon HD 3400 (mobile card). Clearly there is a difference there in horsepower but I didn't think the difference would be so drastic when rendering a relatively simple scene.

After tinkering with a few things it turns out the largest performance killer is my terrain fragment shader. These are my terrain shaders, it's nothing complicated:[/size][/font]

Vertex:

[code]

attribute vec3 in_Vertex;
attribute vec2 in_TexCoord0;
attribute vec4 in_BlendWeights1;
attribute vec4 in_BlendWeights2;

varying vec3 var_Vertex;
varying vec2 var_TexCoord0;
varying vec4 var_BlendWeights1;
varying vec4 var_BlendWeights2;

void main() {
var_Vertex = in_Vertex;
var_TexCoord0 = in_TexCoord0;
var_BlendWeights1 = in_BlendWeights1;
var_BlendWeights2 = in_BlendWeights2;

gl_Position = gl_ModelViewProjectionMatrix * vec4(in_Vertex, 1.0f);
}[/code]


Fragment:


[code]
varying vec3 var_Vertex;
varying vec2 var_TexCoord0;
varying vec4 var_BlendWeights1;
varying vec4 var_BlendWeights2;

// up to 8 terrain textures
uniform sampler2D texture0;
uniform sampler2D texture1;
uniform sampler2D texture2;
uniform sampler2D texture3;
uniform sampler2D texture4;
uniform sampler2D texture5;
uniform sampler2D texture6;
uniform sampler2D texture7;

void main() {
gl_FragColor = (texture2D(texture0, var_TexCoord0.st) * var_BlendWeights1.r) +
(texture2D(texture1, var_TexCoord0.st) * var_BlendWeights1.g) +
(texture2D(texture2, var_TexCoord0.st) * var_BlendWeights1.b) +
(texture2D(texture3, var_TexCoord0.st) * var_BlendWeights1.a) +
(texture2D(texture4, var_TexCoord0.st) * var_BlendWeights2.r) +
(texture2D(texture5, var_TexCoord0.st) * var_BlendWeights2.g) +
(texture2D(texture6, var_TexCoord0.st) * var_BlendWeights2.b) +
(texture2D(texture7, var_TexCoord0.st) * var_BlendWeights2.a);
}[/code]


The Terrain generator calculates blending weights for each texture per-vertex and the fragment shader simply applies those weights, as you can see. Is this a poor approach? Perhaps the actual performance answers that question for me. It looks like on my laptop I lose ~20 fps per texture2D call and ~30 on my desktop. Is it just way too many lookups per fragment? I'm trying to figure out if I should be totally reworking the Terrain engine or if it's still salvageable.

Thanks.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this