Basic Shader Application Not Working


Ive done a vertex and fragmemnt shader in render monkey. Imported the shade (copy and paste) into a resource file in vs2005 and tried to use it in a very basic way. The Program compiles however the shader doesnt seem to be applied at all.

The shader specic code in the app is:

#include <GL/glew.h>

GLhandleARB v, f, p;
	if(GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader){
		v = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
		f = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);

		const char *vv = readFile("lambert.vert");
		const char *ff = readFile("lambert.frag");

		if( vv != NULL && ff != NULL){

			glShaderSourceARB(v, 1, &vv, NULL);
			glShaderSourceARB(f, 1, &ff, NULL);


			delete [] vv;
			delete [] ff;

			p = glCreateProgramObjectARB();

			glAttachObjectARB(p, v);
			glAttachObjectARB(p, f);



			glUniform1iARB(glGetUniformLocationARB(p, "cloudTexture"), 0);

			glUniform4fARB(glGetUniformLocationARB(p, "shaderAmbient"), 1.0f, 0.5f, 0.5f, 1.0f);
			glUniform4fARB(glGetUniformLocationARB(p, "shaderDiffuse"), 1.0f, 0.5f, 0.5f, 1.0f);
			glUniform3fARB(glGetUniformLocationARB(p, "lightPos"), 25.0f, 50.0f, -15.0f);


In Draw Loop:

//Draw Object to be shaded etc
//Other Studd using legacy pipeline

the shaders work find in render monkey so its not the actual shaders (i dont think)

frag shader:

uniform vec4 shaderDiffuse;
uniform vec4 shaderAmbient;

//Link from vertex shader holds texture coords
varying vec2 texCoord;

//Link to <-vertexLight
varying vec3 lightDirection;
varying vec3 normal;

//Cloud Texture Access (2d texture)
uniform sampler2D cloudTexture;

void main(void)
   //Dot Light Direction with normalDirection (Facing Ratio)
   //Need to normalise to get value between 0->1 to get different diffuse values
   float facingRatio = dot(normalize(normal), normalize(lightDirection));

   vec4 diffuseColour = texture2D(cloudTexture,texCoord);
   vec4 light1 = (diffuseColour * shaderDiffuse * facingRatio);
   gl_FragColor = light1 + (shaderAmbient * diffuseColour);

vertex shader:

//The Shader works per vertex

//Used to pass through fixed pipeline to fragment shader
varying vec2 texCoord;
varying vec3 normal;

//Artist Tools
uniform vec3 lightPos;

//Light Vector
varying vec3 lightDirection;

void main(void)
   //Apply fixed pipeline vertex transformations
   gl_Position = ftransform();
   //Multi texture coordinate for texture 0
   texCoord = gl_MultiTexCoord0.xy;
   //Get Current Vertex Position (to subtract from lightPos to get the vector)
   //Mulitply my modelview to put vetex position into world coordinates
   vec4 objectPos =  gl_ModelViewMatrix * gl_Vertex;
   //Apply the light position into the world space (convert to vec4 w = 1)
   //Finds <-vertexLight
   lightDirection = (gl_ModelViewMatrix * vec4(lightPos, 1)).xyz -;
   //Set Model Normals to be pass to fragment shader
   normal = gl_NormalMatrix * gl_Normal;

Im using glew, visualc++ (visual studio 2005)
My gpu supports the latest shaders and gl2.0+

Does something need to be set for glew etc to work in vs2005 or is my code wrong.

Ive set up glew in the linker and in the lib and include sections of vs

Many Thanks For Your help this has been bugging me for a couple of days now


So what is happening? Does it crash? Does something appear on the screen? What does shader log say= What does glGetError return? And, it is not clear in your code if you bind a texture to unit 0 at all…


well it doesnt crash or anything.

It just seems to render the object using the fixed pipeline almost ignoring the shader.


 glUniform1iARB(glGetUniformLocationARB(p, "cloudTexture"), 0);

bind the texture to unit 0

Thanks For Your Help

Ive done the error check like you said.

I get a return value of 1280.

After looking it up it is a GL_INVALID_ENUM.

What does this mean?


Do you bind the texture using the glBindTexture command? Also, glGetError returns the result of the last issued command, hence you will have to find out which one is it where the error is generated. GL_INVALID_ENUM basically means thgat you pass a wrong parameter somewhere.

ok i found the problem

glShaderSourceARB needs 4th param to tell length of string


Originally posted by appleGuy:

glShaderSourceARB needs 4th param to tell length of string

Only if the string is not zero terminated.