我想寫一個自定義着色器,它用three.js操作我的圖像。 爲此,我想創建一個與圖像作爲紋理的平面。之後我想移動頂點以扭曲圖像。Three.js自定義着色器與紋理
(如果這是一個絕對錯誤的方式來做到這一點,請告訴我)。
首先我有我的着色器:
<script type="x-shader/x-vertex" id="vertexshader">
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main() {
// Pass the texcoord to the fragment shader.
v_texCoord = a_texCoord;
gl_Position = projectionMatrix *
modelViewMatrix *
vec4(position,1.0);
}
</script>
<script type="x-shader/x-fragment" id="fragmentshader">
uniform sampler2D u_texture;
varying vec2 v_texCoord;
void main() {
vec4 color = texture2D(u_texture, v_texCoord);
gl_FragColor = color;
}
</script>
在哪裏我真的不明白什麼的Texture2D是幹什麼的,但我發現,在其他的代碼片段。 我想要的是這個示例:只需使用「底層」圖像(=紋理)中的顏色對頂點(gl_FracColor)進行着色即可。
在我的代碼,我已經建立了正常的3個場景飛機:
// set some camera attributes
var VIEW_ANGLE = 45,
ASPECT = window.innerWidth/window.innerHeight,
NEAR = 0.1,
FAR = 1000;
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(VIEW_ANGLE, ASPECT, NEAR, FAR);
camera.position.set(0, 0, 15);
var vertShader = document.getElementById('vertexshader').innerHTML;
var fragShader = document.getElementById('fragmentshader').innerHTML;
var texloader = new THREE.TextureLoader();
var texture = texloader.load("img/color.jpeg");
var uniforms = {
u_texture: {type: 't', value: 0, texture: texture},
};
var attributes = {
a_texCoord: {type: 'v2', value: new THREE.Vector2()}
};
// create the final material
var shaderMaterial = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: vertShader,
fragmentShader: fragShader
});
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
var plane = {
width: 5,
height: 5,
widthSegments: 10,
heightSegments: 15
}
var geometry = new THREE.PlaneBufferGeometry(plane.width, plane.height, plane.widthSegments, plane.heightSegments)
var material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
var plane = new THREE.Mesh(geometry, shaderMaterial);
scene.add(plane);
plane.rotation.y += 0.2;
var render = function() {
requestAnimationFrame(render);
// plane.rotation.x += 0.1;
renderer.render(scene, camera);
};
render();
不幸的是,在運行該代碼後,我只看到一個黑色窗口。雖然我知道如果在創建網格時使用material
作爲材質,我可以清楚地看到它。 所以它必須是着色器材質或着色器。
問題:
- 我必須定義統一
u_texture
,在我的着色材料的制服和屬性的屬性a_texCoord
?並且做 他們必須有完全相同的名字? - 無論如何有多少個頂點?我會得到圖像中每個像素的頂點嗎?或者這架飛機的每個角落只有4個?
a_texCoord有什麼價值?什麼也沒有發生,如果我寫:
var attributes = { a_texCoord: {type: 'v2', value: new THREE.Vector2(1,1)} };
還是我必須使用一些映射(內置地圖的東西從三個)?但是,我將如何改變頂點位置?
難道有人會對此事有所瞭解嗎?