Shader.lua

From GiderosMobile

Available since: Gideros 2020.7
Class: Shader

Description

Creates a new Lua shader instance.

Shader.lua(vertexShader,fragmentShader,flags,uniformDescriptor,attributeDescriptor)
Requirements:
In order to use Lua Shaders you need to include luashader standard library in your projects
luashader standard library is available in your Gideros installation folder under Library

Parameters

vertexShader: (function) the vertex shader function
fragmentShader: (function) the fragment shader function
flags: (number) a set of numerical flags or 0 if none: Shader Flags
uniformDescriptor: (table) an array of uniforms/constants descriptors: Shader Uniform Descriptors
attributeDescriptor: (table) an array of attributes descriptors: Shader Attribute Descriptors

Example

A wave shader

function vswave(vVertex, vColor, vTexCoord) : Shader
	local vertex = hF4(vVertex, 0.0, 1.0)
	fTexCoord = vTexCoord
	return vMatrix * vertex
end
function fswave() : Shader
	local tc = hF2(fTexCoord.x + (1 + sin(fTexCoord.x * 10 + fTime * 2)) * 0.05, fTexCoord.y) * 0.9
	local frag = lF4(fColor) * texture2D(fTexture, tc)
	if (frag.a == 0.0) then discard() end
	return frag
end

local wave = Shader.lua(vswave, fswave, 0,
	{
	{name = "vMatrix", type = Shader.CMATRIX, sys = Shader.SYS_WVP, vertex = true},
	{name = "fColor", type = Shader.CFLOAT4, sys = Shader.SYS_COLOR, vertex = false},
	{name = "fTexture", type = Shader.CTEXTURE, vertex = false},
	{name = "fTextureInfo", type = Shader.CFLOAT4, sys = Shader.SYS_TEXTUREINFO, vertex = false},
	{name = "fTime", type = Shader.CFLOAT, sys = Shader.SYS_TIMER, vertex = false},
	},
	{
	{name = "vVertex", type = Shader.DFLOAT, mult = 2, slot = 0, offset = 0},
	{name = "vColor", type = Shader.DUBYTE, mult = 4, slot = 1, offset = 0},
	{name = "vTexCoord", type = Shader.DFLOAT, mult = 2, slot = 2, offset = 0},
	},
	{
	{name = "fTexCoord", type = Shader.CFLOAT2},
	}
)

-- bg color
application:setBackgroundColor(0x909090)
-- a texture and a bitmap
local bmp = Bitmap.new(Texture.new("gfx/test.png"))
-- position
bmp:setPosition(32*2, 32*4)
-- lua shader
bmp:setShader(wave)
-- order
stage:addChild(bmp)

-- loop
local timer = 0
stage:addEventListener(Event.ENTER_FRAME, function(e)
	timer += 0.018
	wave:setConstant("fTime", Shader.CFLOAT, 1, timer)
	bmp:setX(bmp:getX() + 1)
	if bmp:getX() > 400 then bmp:setX(-80) end
end)