Shader input
Shaders take input in two forms: vertex attributes and uniform values. Vertex attributes are unique per vertex and fetched from GPU memory depending on the vertex being processed. Uniform values are set and remain constant for large groups of vertices.
Attributes
Each vertex has associated attributes (color, position, anything!). All attributes are uploaded to the GPU before any rendering takes place. At render, we useglVertexAttribPointer
to control how the attributes are used. The GPU will then process the vertices, iterating through all vertices, reading attributes from memory based on vertex ID.
Attribute host syntax
This should be familiar:glGenBuffers(..) //make buffer glBindBuffer(..) //activate buffer object glBufferData(..) //upload dataglGetAttribLocation .. glGetAttribLocation(..) //bind shader input to buffer glEnableVertexAttribArray(..) //enable the attribute glVertexAttribPointer(..) //configure buffer
Attribute device syntax
in vec2 position; in vec3 color;
Uniforms
Uniforms are small and cheap to upload, since they do not change per vertex, but stay constant over many vertices. Uniforms can be used to drive change in shader programs. For example, it is easy to control animation using a time variable. Time can be uploaded to the GPU as a single float.
Uniform syntax on host
slotId = glGetUniformLocation(shaderHandle, "slot_name"); glUniform1f(slotId, float_val);When uploading a uniform, you must specify a count, a type, and optionally a vector flag:
glUniform{1|2|3|4}{f|i|ui}[v](location, inputs)
Two was of uploading a 2 component float vector:
vector2 val; //a vector2 on the host glUniform2f(loc, val.x, val.y); //upload as 2 floats glUniform2fv(loc, &val, 1); //upload as a 2 float vector
Uniform syntax on device
The shader must be prepared to accept input from the host. Variables with theuniform
qualifier are expected to be bound on the host and are set to 0 if not bound. The type of host call to glUniform
must match the type expected in the shader. Example for a 2 component float vector:
uniform vec2 v;
Review
Attributes
- Arrays of values uploaded to GPU
- Iterated through when processing vertices
- Each vertex gets its own unique values
- Upload and reupload as often as needed
- Constant valued, do not change per vertex