Basic code:
Code: Select all
#include "openb3d.bi"
screenres 800,600, 32, , &h10002
Graphics3d 800,600,32,1,1
var camera=createcamera(0)
cameraclscolor camera,0,0,255
'camerarange camera,3,10000
var woodshader=LoadShader("wood", "wood.vert", "wood.frag")
UseSurface (woodshader,"position",0,1)
UseSurface (woodshader,"uv",0,2)
UseSurface (woodshader,"normal",0,4)
UseMatrix (woodshader,"projectionMatrix",2)
UseMatrix (woodshader,"modelViewMatrix",3)
UseMatrix (woodshader,"modelMatrix",0)
SetFloat3 (woodshader, "color1",0.54117647058, 0.23137254901960785, 0.11764705882352941)
SetFloat3 (woodshader, "color2",0.7843137254901961, 0.5411764705882353, 0.4196078431372549)
SetFloat (woodshader, "frequency",2)
SetFloat (woodshader, "noiseScale",6)
SetFloat (woodshader, "ringScale",.6)
SetFloat (woodshader, "contrast",4)
'cameraclscolor camera,0,255,0
var cube=createcube()
shadeentity cube, woodshader
'moveentity cube,0,0,7
entitycolor cube,255,0,0
var plane=createplane()'cube():scaleentity plane, 100,.1,100
moveentity plane,0,-1.4,15
var light=createlight()
moveentity light,10,10,-3
pointentity light,cube
moveentity camera,-2,0,-5
'createshadow cube
dim key as string
dim as integer bw, fullset
do
key=inkey
if key="a" then moveentity cube,0,0,1
if key="z" then moveentity cube,0,0,-1
' if key="f" then fullset=1-fullset: setinteger asciishader, "fullset",fullset
' if key="b" then bw=1-bw: setinteger asciishader, "bw",bw
if key=chr(255)+"H" then turnentity cube,1,0,0,0
if key=chr(255)+"P" then turnentity cube,-1,0,0,0
if key=chr(255)+"M" then turnentity cube,0,-1,0,0
if key=chr(255)+"K" then turnentity cube,0,1,0,0
updateworld 1
renderworld
flip
sleep 1
loop until key=chr(27)
Vertex shader ("wood.vert")
Code: Select all
#version 100
precision highp float;
precision highp int;
uniform mat4 modelMatrix;
uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat3 normalMatrix;
attribute vec3 position;
attribute vec3 normal;
attribute vec2 uv;
attribute vec2 uv2;
varying vec3 vPosition;
varying vec3 vNormal;
varying vec2 vUv;
void main() {
vNormal = normal;
vUv = uv;
vPosition = position;
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
Code: Select all
#version 100
// Adapted from the awesome http://blog.2pha.com/demos/threejs/shaders/wood_grain.html
precision highp float;
precision highp int;
uniform vec3 color1;
uniform vec3 color2;
uniform float frequency;
uniform float noiseScale;
uniform float ringScale;
uniform float contrast;
uniform float time;
varying vec3 vNormal;
varying vec2 vUv;
varying vec3 vPosition;
vec3 mod289(vec3 x) {
return x - floor(x * (1.0 / 289.0)) * 289.0;
}
vec4 mod289(vec4 x) {
return x - floor(x * (1.0 / 289.0)) * 289.0;
}
vec4 permute(vec4 x) {
return mod289(((x*34.0)+1.0)*x);
}
vec4 taylorInvSqrt(vec4 r) {
return 1.79284291400159 - 0.85373472095314 * r;
}
float snoise(vec3 v) {
const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;
const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);
// First corner
vec3 i = floor(v + dot(v, C.yyy) );
vec3 x0 = v - i + dot(i, C.xxx) ;
// Other corners
vec3 g = step(x0.yzx, x0.xyz);
vec3 l = 1.0 - g;
vec3 i1 = min( g.xyz, l.zxy );
vec3 i2 = max( g.xyz, l.zxy );
// x0 = x0 - 0.0 + 0.0 * C.xxx;
// x1 = x0 - i1 + 1.0 * C.xxx;
// x2 = x0 - i2 + 2.0 * C.xxx;
// x3 = x0 - 1.0 + 3.0 * C.xxx;
vec3 x1 = x0 - i1 + C.xxx;
vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y
vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y
// Permutations
i = mod289(i);
vec4 p = permute( permute( permute(
i.z + vec4(0.0, i1.z, i2.z, 1.0 ))
+ i.y + vec4(0.0, i1.y, i2.y, 1.0 ))
+ i.x + vec4(0.0, i1.x, i2.x, 1.0 ));
// Gradients: 7x7 points over a square, mapped onto an octahedron.
// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)
float n_ = 0.142857142857; // 1.0/7.0
vec3 ns = n_ * D.wyz - D.xzx;
vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)
vec4 x_ = floor(j * ns.z);
vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)
vec4 x = x_ *ns.x + ns.yyyy;
vec4 y = y_ *ns.x + ns.yyyy;
vec4 h = 1.0 - abs(x) - abs(y);
vec4 b0 = vec4( x.xy, y.xy );
vec4 b1 = vec4( x.zw, y.zw );
vec4 s0 = floor(b0)*2.0 + 1.0;
vec4 s1 = floor(b1)*2.0 + 1.0;
vec4 sh = -step(h, vec4(0.0));
vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;
vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;
vec3 p0 = vec3(a0.xy,h.x);
vec3 p1 = vec3(a0.zw,h.y);
vec3 p2 = vec3(a1.xy,h.z);
vec3 p3 = vec3(a1.zw,h.w);
// Normalise gradients
vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));
p0 *= norm.x;
p1 *= norm.y;
p2 *= norm.z;
p3 *= norm.w;
// Mix final noise value
vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);
m = m * m;
return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),
dot(p2,x2), dot(p3,x3) ) );
}
void main() {
float n = snoise( vPosition );
float ring = fract( frequency * vPosition.z + noiseScale * n );
ring *= contrast * ( 1.0 - ring );
// Adjust ring smoothness and shape, and add some noise
float lerp = pow( ring, ringScale ) + n;
vec3 base = mix( color1, color2, lerp);
gl_FragColor = vec4( base, 1.0 );
}