I am very new to glsl and am trying to get some basic applications written to get the general idea of how a glsl program works. Currently I am doing a simple shader where I stretch an object (a torus in this case) by applying a scale to its vertices. However I can’t seem to get it working correctly and this problem has brought to my attention a few other questions I have pertaining to vertex and fragment shaders in general.
First of all this is the shader I am using to perform the vertex transforms (this is based on an example from the OpenGL SuperBible)–
// light position used for lighting calculations
uniform vec3 lightPos0;
uniform vec3 color;
uniform vec3 squashStretch;
void main()
{
// glPosition is a built in variable that stores the output vertex position.
// Here we multiply the object space vertex (gl_Vertex) by the model view
// projection matrix to transform the vertex to clip space.
vec4 stretchCoord = gl_Vertex;
stretchCoord.xyz *= squashStretch;
vec4 clipCoord = gl_ModelViewProjectionMatrix * stretchCoord;
// copy the clip space coordinates into our position
gl_Position = clipCoord;
vec3 stretchedNormal = gl_Normal;
stretchedNormal *= squashStretch;
// Let there be light!
vec3 N = normalize(gl_NormalMatrix * stretchedNormal);
vec3 V = gl_ModelViewMatrix * stretchCoord;
vec3 L = normalize(lightPos0 - V.xyz);
vec3 H = normalize(L + vec3(0.0, 0.0, 1.0));
// specular contribution
//const float spec = 128.0;
// calculate the diffuse lighting
float NdotL = dot(N, L);
vec4 diffuse = gl_Color * vec4(max(0.0, NdotL));
// calculate the specular component
float NdotH = max(0.0, dot(N, H) * 8.0 - 7.0);
gl_TexCoord[0] = vec4(NdotH, 0.0, 0.0, 1.0);
gl_FrontColor = diffuse;
// calculate normalized device coords
vec3 ndc = clipCoord.xyz / clipCoord.w;
// map from (-1, 1) to (0, 1) before outputting
vec3(gl_SecondaryColor) = (ndc * 0.5) + 0.5;
}
For some reason the above code not only doesn’t do what I want it to (essentially stretch the torus into a more oblong shape) but in fact nothing renders to the screen at all except for a black background. I have tried a few variations of this method and none seem to be working. This also leads to my next question which pertains to the variables listed ahead of the main() function signature. I know that the uniform qualifier means these variables remain constant but must be initialized outside of the shader, but I am not sure where they should be initialized. I am assuming that they must be init’d in my C code through OpenGL states and the like but I am not sure. I have gotten basic lighting (diffuse, specular) to work fine with the shader so I’m assuming I just need to somehow pass a value to the squashStretch param that is used for my lighting and vertex transform calculations. Thanks for any help you can give me and I apologize for the lengthy post (I hate reading long posts too).
Thanks again in advance