GLSL Shader Texture Performance

Posted by Austin on Game Development See other posts from Game Development or by Austin
Published on 2012-06-27T19:25:37Z Indexed on 2012/06/27 21:26 UTC
Read the original article Hit count: 297

Filed under:
|
|
|

I currently have a project that renders OpenGL video using a vertex and fragment shader. The shaders work fine as-is, but in trying to add in texturing, I am running into performance issues and can't figure out why.

Before adding texturing, my program ran just fine and loaded my CPU between 0%-4%. When adding texturing (specifically textures AND color -- noted by comment below), my CPU is 100% loaded. The only code I have added is the relevant texturing code to the shader, and the "glBindTexture()" calls to the rendering code.

Here are my shaders and relevant rending code.

Vertex Shader:

#version 150

uniform mat4   mvMatrix;
uniform mat4   mvpMatrix;
uniform mat3   normalMatrix;
uniform vec4   lightPosition;
uniform float  diffuseValue;

layout(location = 0) in vec3 vertex;
layout(location = 1) in vec3 color;
layout(location = 2) in vec3 normal;
layout(location = 3) in vec2 texCoord;

smooth out VertData {
    vec3   color;
    vec3   normal;
    vec3   toLight;
    float  diffuseValue;
    vec2   texCoord;
} VertOut;

void main(void)
{
    gl_Position = mvpMatrix * vec4(vertex, 1.0);

    VertOut.normal = normalize(normalMatrix * normal);
    VertOut.toLight = normalize(vec3(mvMatrix * lightPosition - gl_Position));
    VertOut.color = color;
    VertOut.diffuseValue = diffuseValue;
    VertOut.texCoord = texCoord;
}

Fragment Shader:

#version 150

smooth in VertData {
    vec3   color;
    vec3   normal;
    vec3   toLight;
    float  diffuseValue;
    vec2   texCoord;
} VertIn;

uniform sampler2D tex;

layout(location = 0) out vec3 colorOut;

void main(void)
{
    float diffuseComp = max( dot(normalize(VertIn.normal), normalize(VertIn.toLight)) ), 0.0);

    vec4 color = texture2D(tex, VertIn.texCoord);
    colorOut = color.rgb * diffuseComp * VertIn.diffuseValue + color.rgb * (1 - VertIn.diffuseValue);
    // FOLLOWING LINE CAUSES PERFORMANCE ISSUES
    colorOut *= VertIn.color;
}

Relevant Rendering Code:

// 3 textures have been successfully pre-loaded, and can be used
//     texture[0] is a 1x1 white texture to effectively turn off texturing

glUseProgram(program);

// Draw squares
glBindTexture(GL_TEXTURE_2D, texture[1]);
// Set attributes, uniforms, etc
glDrawArrays(GL_QUADS, 0, 6*4);

// Draw triangles
glBindTexture(GL_TEXTURE_2D, texture[0]);
// Set attributes, uniforms, etc
glDrawArrays(GL_TRIANGLES, 0, 3*4);

// Draw reference planes
glBindTexture(GL_TEXTURE_2D, texture[0]);
// Set attributes, uniforms, etc
glDrawArrays(GL_LINES, 0, 4*81*2);

// Draw terrain
glBindTexture(GL_TEXTURE_2D, texture[2]);
// Set attributes, uniforms, etc
glDrawArrays(GL_TRIANGLES, 0, 501*501*6);

// Release
glBindTexture(GL_TEXTURE_2D, 0);
glUseProgram(0);

Any help is greatly appreciated!

© Game Development or respective owner

Related posts about opengl

Related posts about textures