PDA

View Full Version : GLSL variables (novice)



candela
05-30-2011, 11:57 AM
hi all,

I'm trying to learn the shading language from "OpenGL Shading language orange book", but I 've difficulty with understanding the predefined/user-defined/built-in variable functionality.

Regarding the brick example in the book, as far as I can gather, vertex shader intrinsic (predefined) in/out variables have " gl_XXX " prefix in their syntax. "in" variables are provided by pipeline itself and out variables should be supplied by the vertex shader, correct?

But some user-defined variables in program e.g. MVMatrix, MVPMatrix etc.. is refered in book as predefined variables, if it's so why "gl_XXX" prefix is not maintained.
If it's something else why they are used uninitialized?

Vertex Shader

#version 140
in vec4 MCvertex;
in vec3 MCnormal;
uniform mat4 MVMatrix;
uniform mat4 MVPMatrix;
uniform mat3 NormalMatrix;
uniform vec3 LightPosition;
const float SpecularContribution = 0.3;
const float DiffuseContribution = 1.0 - SpecularContribution;
out float LightIntensity;
out vec2 MCposition;
void main()
{
vec3 ecPosition = vec3(MVMatrix * MCvertex);
vec3 tnorm = normalize(NormalMatrix * MCnormal);
vec3 lightVec = normalize(LightPosition - ecPosition);
vec3 reflectVec = reflect(-lightVec, tnorm);
vec3 viewVec = normalize(-ecPosition);
float diffuse = max(dot(lightVec, tnorm), 0.0);
float spec = 0.0;
if (diffuse > 0.0)
{
spec = max(dot(reflectVec, viewVec), 0.0);
spec = pow(spec, 16.0);
}
LightIntensity = DiffuseContribution * diffuse +
SpecularContribution * spec;
MCposition = MCvertex.xy;
gl_Position = MVPMatrix * MCvertex;
}

Alfonse Reinheart
05-30-2011, 12:04 PM
But some user-defined variables in program e.g. MVMatrix, MVPMatrix etc.. is refered in book as predefined variables, if it's so why "gl_XXX" prefix is not maintained.

I can't speak to what the book is talking about, not having read it (I read the specification instead). But I can say that those are not predefined variables as far as GLSL is concerned. Perhaps this is simply a typo in the book, or perhaps they're using that phrase in a different context (which is misleading and not a good idea, but not strictly erroneous).

candela
05-30-2011, 12:40 PM
Hmm, that's quite misleading, there is a fully-fledged code for vertex and fragment shader with that syntax. I also have GLSL Quik Reference Guide where depicts the built-in uniforms/functions, VS variables, FS variables etc.. and the purpose they are serving is pretty explicit.

So basically need to be replaced with that

uniform mat4 gl_ModelViewMatrix;
uniform mat4 gl_ModelViewProjectionMatrix;
AFAIU


How about the LightPosition variable they used? not any predefined varible in QuickRef and can not be extracted by common parameters in my idea?

Alfonse Reinheart
05-30-2011, 12:42 PM
So basically need to be replaced with that

Why? If they wrote that GLSL code, then they're not using built-in variables. So the C/C++ code that uses it must be expecting these uniforms and filling them in with data.

candela
05-30-2011, 12:52 PM
Oops something is really wrong with my perception of variable usage in shaders.

So you say that variables are defined in high-level language and passed by to shader, right ?

Have to reread the variable definitions, sorry for wasting time.

Aleksandar
05-30-2011, 01:35 PM
Please, don't state something that is not written in the book!
OpenGL Shading language is a really great book, and everything is described correctly. But there are a lot of details neglected by beginners.

Built-in variables are referred through the book as special input(4.2.2) and output variables(4.2.5).

Candela, my advice is to find some easy tutorial (like lighthouse3d), and get sense of using shaders. Then go back to Orange book and read it carefully. It is worth reading, but it is hard to understand for beginners.