【发布时间】:2014-11-02 14:31:23
【问题描述】:
我在 three.js 中搜索了从简单到复杂的着色器示例,但似乎找不到将顶点保持的颜色传递给片段着色器的简单示例。我做了一个简单的例子,其中顶点着色器只将顶点留在它们所在的位置,但也通过“vColor”变化将“颜色”统一(我想我在某处看到但尚未使用)传递给片段着色器,然后在片段着色器中,我试图返回相同的颜色。浏览器将三角形渲染为黑色,我猜颜色是空的。我知道这很简单,但我自己无法弄清楚,我无法弄清楚 ShaderMaterial 将什么传递给我可以在那里玩的着色器。有人可以解释一下吗?
代码如下:
<script id="vertexShader" type="x-shader/x-vertex">
uniform vec3 color;
varying vec3 vColor;
void main(){
vColor = color;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
</script>
<script id="fragmentShader" type="x-shader/x-fragment">
varying vec3 vColor;
void main(){
gl_FragColor = vec4( vColor.rgb, 1.0 );
}
</script>
<script>
var container,
camera,
controls,
scene,
renderer,
model;
init();
animate();
function init() {
camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 10000);
camera.position.y = 150;
camera.position.z = 500;
scene = new THREE.Scene();
var geometry = new THREE.Geometry();
geometry.vertices.push(
new THREE.Vector3(0, 0, 0),
new THREE.Vector3(-120, -200, 0),
new THREE.Vector3(120, -200, 0));
geometry.faces.push(new THREE.Face3(0, 1, 2));
geometry.faces[0].vertexColors[0] = new THREE.Color("rgb(255,0,0)");
geometry.faces[0].vertexColors[1] = new THREE.Color("rgb(0,255,0)");
geometry.faces[0].vertexColors[2] = new THREE.Color("rgb(0,0,255)");
var materialShader = new THREE.ShaderMaterial({
vertexShader: document.getElementById('vertexShader').textContent,
fragmentShader: document.getElementById('fragmentShader').textContent
});
var materialBasic = new THREE.LineBasicMaterial({
vertexColors: THREE.VertexColors,
linewidth: 1
});
var model = new THREE.Mesh(geometry, materialShader);
model.position.y = 150;
scene.add(model);
renderer = new THREE.WebGLRenderer();
renderer.setClearColor(0xf0f0f0);
renderer.setSize(window.innerWidth, window.innerHeight);
container = document.createElement('div');
document.body.appendChild(container);
container.appendChild(renderer.domElement);
window.addEventListener('resize', onWindowResize, false);
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
function animate() {
requestAnimationFrame(animate);
render();
}
function render() {
renderer.render(scene, camera);
}
</script>
请注意,我有两种类型的材料用于测试 - 用于着色器的 materialShader 和作为可正常工作的控制材料的 materialBasic。我没有足够的声誉来发布图片,但如果堆栈溢出继续上传图片,你应该在这里看到渲染的例子:http://i.stack.imgur.com/tjdSt.png
【问题讨论】:
标签: three.js