Writing Lua Shaders
LUA Shaders
Description
Creating a Shader
Typical Lua Vertex and Fragment shader code:
function vertex(vVertex,vColor,vTexCoord)
local vertex = hF4(vVertex,0.0,1.0)
fTexCoord=vTexCoord
return vMatrix*vertex
end
function fragment()
local frag=lF4(fColor)*texture2D(fTexture, fTexCoord)
local coef=lF3(0.2125, 0.7154, 0.0721)
local gray=dot(frag.rgb,coef)
frag.rgb=lF3(gray,gray,gray)
if (frag.a==0.0) then discard() end
return frag
end
Changing Uniforms/Constants
In order to change the value of a uniform from Lua, use the setConstant function, it takes three arguments:
- the uniform name
- the type of data to set (one of the Shader.Cxxx constants)
- the actual data to set, either as a table or as multiple arguments
Associating a Shader to a Sprite
The Sprite API has a new call to deal with that: Sprite:setShader(shader) tells Gideros to use the specified shader for rendering the sprite. Setting back the shader to nil actually revert to the default shader.
The API allows the creation of Shader objects from within Lua. The 'Shader.new()' constructor takes five arguments:
- The vertex shader code (a lua function).
- The fragment shader code (a lua function).
- A set of numerical flags or 0 if none.
- An array of uniforms/constants descriptors.
- An array of attributes descriptors.
With Lua Shaders, it is assumed that the code is within the vertex and fragment parameter functions.
Lua Shader Functions
(Please note that these functions may or may not be available, the Lua shader is still under development)
Restrictions
Don't rely on anything external, basically no globals except for attributes, uniforms and varying.
- No Do..While
- No Repeat..Until
- No tables. The only allowed form of table lookup is for vector component swizzling and access to uniform arrays
- No strings, userdata, etc. Basically only numbers are supported
- Mind your types! Although lua is not a typed language, shaders need types
- Always check on all platforms: Gideros will translate your lua code to GLSL,HLSL or MSL code, but some platforms are more strict than others about what you can write, or how many arguments a common function is supposed to take
Lua Shaders Pebbles and Demos