Playcanvas에서 띄우는 방법
배포 사이트 | Shader 동작 확인용 | (https://playcanv.as/p/GnoWE25J/)
프로젝트 링크 | 로그인 필요 | (https://playcanvas.com/project/1235947/overview/shader-study)
Editor: 프로젝트 세팅 + Scene 구성 + Script 파일 확인 가능
Play: Playcanvas 자헤 배포 사이트
Fork: 프로젝트 떠가기
프로젝트 설명
- Shader가 그려질 Plane entity 1,2,3 존재
- 각각 Script 부착: GLSL Shader코드 -> Material 에 입혀서 렌더링 시켜줄 코드
Sample Custom Shader Code
출처 | Playcanvas 공식 문서 | https://developer.playcanvas.com/tutorials/custom-shaders/
var CustomShader = pc.createScript('customShader');
CustomShader.attributes.add('vs', {
type: 'asset',
assetType: 'shader',
title: 'Vertex Shader'
});
CustomShader.attributes.add('fs', {
type: 'asset',
assetType: 'shader',
title: 'Fragment Shader'
});
CustomShader.attributes.add('diffuseMap', {
type: 'asset',
assetType: 'texture',
title: 'Diffuse Map'
});
CustomShader.attributes.add('heightMap', {
type: 'asset',
assetType: 'texture',
title: 'Height Map'
});
// initialize code called once per entity
CustomShader.prototype.initialize = function() {
this.time = 0;
var app = this.app;
var gd = app.graphicsDevice;
var diffuseTexture = this.diffuseMap.resource;
var heightTexture = this.heightMap.resource;
var vertexShader = this.vs.resource;
var fragmentShader = "precision " + gd.precision + " float;\n";
fragmentShader = fragmentShader + this.fs.resource;
// A shader definition used to create a new shader.
var shaderDefinition = {
attributes: {
aPosition: pc.SEMANTIC_POSITION,
aUv0: pc.SEMANTIC_TEXCOORD0
},
vshader: vertexShader,
fshader: fragmentShader
};
// Create the shader from the definition
this.shader = new pc.Shader(gd, shaderDefinition);
// Create a new material and set the shader
this.material = new pc.Material();
this.material.shader = this.shader;
// Set the initial time parameter
this.material.setParameter('uTime', 0);
// Set the diffuse texture
this.material.setParameter('uDiffuseMap', diffuseTexture);
// Use the "clouds" texture as the height map property
this.material.setParameter('uHeightMap', heightTexture);
// Replace the material on the model with our new material
var renders = this.entity.findComponents('render');
for (var i = 0; i < renders.length; ++i) {
var meshInstances = renders[i].meshInstances;
for (var j = 0; j < meshInstances.length; j++) {
meshInstances[j].material = this.material;
}
}
};
// update code called every frame
CustomShader.prototype.update = function(dt) {
this.time += dt;
// Bounce value of t 0->1->0
var t = (this.time % 2);
if (t > 1) {
t = 1 - (t - 1);
}
// Update the time value in the material
this.material.setParameter('uTime', t);
};