Difference between revisions of "Custom Shader Examples"

From GiderosMobile
(Created page with "__NOTOC__ '''Parent:''' Writing Custom Shaders<br/> === A Grey Shader === The code below defines a Grey shader consisting of: * mycshaders/vShaderGrey.glsl vertex shader...")
 
Line 74: Line 74:
 
stage:addChild(bitmap)
 
stage:addChild(bitmap)
 
stage:addChild(bitmap2)
 
stage:addChild(bitmap2)
 +
</syntaxhighlight>
 +
 +
=== A Wave Shader ===
 +
{{#widget:GApp|app=Playground_Shaders_Wave.GApp|width=480|height=320|auto=1}}
 +
 +
The code below defines a Wave shader consisting of:
 +
* mycshaders/vShaderWave.glsl vertex shader
 +
* mycshaders/fShaderWave.glsl fragment shader
 +
 +
Here the shader files are in the '''assets/mycshaders''' directory.
 +
 +
'''GLSL Vertex Shader:''' ''mycshaders/vShaderWave.glsl''
 +
<syntaxhighlight lang="c">
 +
attribute vec4 POSITION0;
 +
attribute vec2 TEXCOORD0;
 +
uniform mat4 g_MVPMatrix;
 +
varying vec2 texCoord;
 +
 +
void main()
 +
{
 +
gl_Position = g_MVPMatrix * POSITION0;
 +
texCoord = TEXCOORD0;
 +
}
 +
</syntaxhighlight>
 +
 +
'''GLSL Fragment Shader:''' ''mycshaders/fShaderWave.glsl''
 +
<syntaxhighlight lang="c">
 +
uniform lowp sampler2D g_Texture;
 +
uniform lowp vec4 g_Color;
 +
uniform highp float time;
 +
varying highp vec2 texCoord;
 +
 +
void main()
 +
{
 +
highp vec2 tc = texCoord.xy;
 +
// highp float dist = cos(tc.x * 24.0 - time * 4.0) * 0.02;
 +
highp float dist = cos(tc.x * 2.0 - time * 8.0) * 0.02;
 +
highp vec2 uv = tc + dist;
 +
gl_FragColor = g_Color * texture2D(g_Texture, uv);
 +
}
 +
</syntaxhighlight>
 +
 +
'''Lua Code'''
 +
<syntaxhighlight lang="lua">
 +
-- open gl shader
 +
local shaderwave = Shader.new("mycshaders/vShaderWave", "mycshaders/fShaderWave", 0,
 +
{
 +
{name="g_MVPMatrix", type=Shader.CMATRIX, sys=Shader.SYS_WVP, vertex=true},
 +
{name="g_Color", type=Shader.CFLOAT4, mult=1, sys=Shader.SYS_COLOR},
 +
{name="g_Texture", type=Shader.CTEXTURE, mult=1, vertex=false},
 +
{name="time", type=Shader.CFLOAT, mult=1, vertex=false}
 +
},
 +
{
 +
{name="POSITION0", type=Shader.DFLOAT, mult=3, slot=0, offset=0},
 +
{name="vColor", type=Shader.DUBYTE, mult=0, slot=1, offset=0},
 +
{name="TEXCOORD0", type=Shader.DFLOAT, mult=2, slot=2, offset=0}
 +
}
 +
)
 +
 +
application:setBackgroundColor(0x333333)
 +
 +
local bitmap = Bitmap.new(Texture.new("gfx/test.png"))
 +
local bitmap2 = bitmap:clone()
 +
-- position
 +
bitmap:setPosition(32*1, 32*4)
 +
bitmap2:setPosition(32*6, 32*1)
 +
-- shaders
 +
bitmap:setShader(shaderwave)
 +
bitmap2:setShader(shaderwave)
 +
-- order
 +
stage:addChild(bitmap)
 +
stage:addChild(bitmap2)
 +
 +
-- loop
 +
local timer = 0
 +
stage:addEventListener(Event.ENTER_FRAME, function(e)
 +
timer += 0.018
 +
shaderwave:setConstant("time", Shader.CFLOAT, 1, timer)
 +
bitmap:setX(bitmap:getX() + 1)
 +
if bitmap:getX() > 400 then bitmap:setX(-80) end
 +
end)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
{{GIDEROS IMPORTANT LINKS}}
 
{{GIDEROS IMPORTANT LINKS}}

Revision as of 22:53, 5 November 2023

Parent: Writing Custom Shaders

A Grey Shader

The code below defines a Grey shader consisting of:

  • mycshaders/vShaderGrey.glsl vertex shader
  • mycshaders/fShaderGrey.glsl fragment shader

Here the shader files are in the assets/mycshaders directory.

GLSL Vertex Shader: mycshaders/vShaderGrey.glsl

uniform highp mat4 vMatrix;
attribute highp vec3 vVertex;
attribute mediump vec2 vTexCoord;
varying mediump vec2 fTexCoord;

void main() {
	vec4 vertex = vec4(vVertex, 0.8); // vertex coords, scale
	gl_Position = vMatrix*vertex;
	fTexCoord = vTexCoord;
}

GLSL Fragment Shader: mycshaders/fShaderGrey.glsl

//precision highp float;
#ifdef GLES2
	precision highp float;
#endif
uniform lowp vec4 fColor;
uniform lowp sampler2D fTexture;
varying mediump vec2 fTexCoord;
 
void main() {
	lowp vec4 frag = fColor*texture2D(fTexture, fTexCoord);
	float color;
	if (frag.a == 0.0) {
		gl_FragColor = vec4(1.0, 0.5, 1.0, 1.0); // purple
	} else {
		color = dot(frag.rgb, vec3(0.299, 0.587, 0.114));
		gl_FragColor = vec4(color, color, color, frag.a); // gray
	}
}

Lua Code

-- open gl shader
local shadergrey = Shader.new("mycshaders/vShaderGrey", "mycshaders/fShaderGrey", 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="vVertex", type=Shader.DFLOAT, mult=3, 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},
	}
)

application:setBackgroundColor(0x333333)

local bitmap = Bitmap.new(Texture.new("gfx/test.png"))
local bitmap2 = Bitmap.new(Texture.new("gfx/arrow_0001.png"))
-- position
bitmap:setPosition(32*1, 32*4)
bitmap2:setPosition(32*6, 32*1)
-- shaders
bitmap:setShader(shadergrey)
bitmap2:setShader(shadergrey)
-- order
stage:addChild(bitmap)
stage:addChild(bitmap2)

A Wave Shader

The code below defines a Wave shader consisting of:

  • mycshaders/vShaderWave.glsl vertex shader
  • mycshaders/fShaderWave.glsl fragment shader

Here the shader files are in the assets/mycshaders directory.

GLSL Vertex Shader: mycshaders/vShaderWave.glsl

attribute vec4 POSITION0;
attribute vec2 TEXCOORD0;
uniform mat4 g_MVPMatrix;
varying vec2 texCoord;

void main()
{
	gl_Position = g_MVPMatrix * POSITION0;
	texCoord = TEXCOORD0;
}

GLSL Fragment Shader: mycshaders/fShaderWave.glsl

uniform lowp sampler2D g_Texture;
uniform lowp vec4 g_Color;
uniform highp float time;
varying highp vec2 texCoord;

void main()
{
	highp vec2 tc = texCoord.xy;
//	highp float dist = cos(tc.x * 24.0 - time * 4.0) * 0.02;
	highp float dist = cos(tc.x * 2.0 - time * 8.0) * 0.02;
	highp vec2 uv = tc + dist;
	gl_FragColor = g_Color * texture2D(g_Texture, uv);
}

Lua Code

-- open gl shader
local shaderwave = Shader.new("mycshaders/vShaderWave", "mycshaders/fShaderWave", 0,
	{
	{name="g_MVPMatrix", type=Shader.CMATRIX, sys=Shader.SYS_WVP, vertex=true},
	{name="g_Color", type=Shader.CFLOAT4, mult=1, sys=Shader.SYS_COLOR},
	{name="g_Texture", type=Shader.CTEXTURE, mult=1, vertex=false},
	{name="time", type=Shader.CFLOAT, mult=1, vertex=false}
	},
	{
	{name="POSITION0", type=Shader.DFLOAT, mult=3, slot=0, offset=0},
	{name="vColor", type=Shader.DUBYTE, mult=0, slot=1, offset=0},
	{name="TEXCOORD0", type=Shader.DFLOAT, mult=2, slot=2, offset=0}
	}
)

application:setBackgroundColor(0x333333)

local bitmap = Bitmap.new(Texture.new("gfx/test.png"))
local bitmap2 = bitmap:clone()
-- position
bitmap:setPosition(32*1, 32*4)
bitmap2:setPosition(32*6, 32*1)
-- shaders
bitmap:setShader(shaderwave)
bitmap2:setShader(shaderwave)
-- order
stage:addChild(bitmap)
stage:addChild(bitmap2)

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