【发布时间】:2014-06-25 23:59:21
【问题描述】:
终于有时间玩着色器了,但有一刻卡住了。我想将顶点传递给着色器并在其上制作一些 gpgpu。
Gpgpu 工作正常,我猜是因为我看到几个像素和一个在中心的像素被推到一边,因为我输入代码只是为了测试。
现在我想传递球体顶点。这是我正在采取的步骤。请指出错误:-)
编辑:添加小提琴 - click here
1) 创建几何图形,并将其传递给数据数组。
geometry = new THREE.SphereGeometry( 0.2, 15, 15 );
console.log(geometry.vertices.length);
var a = new Float32Array(geometry.vertices.length * 4);
for(var k=0; k<geometry.vertices.length; k++) {
a[ k*4 + 0 ] = geometry.vertices[k].x;
a[ k*4 + 1 ] = geometry.vertices[k].y;
a[ k*4 + 2 ] = geometry.vertices[k].z;
a[ k*4 + 3 ] = 1;
}
2) 保存在数据纹理中
posTexture[2] = new THREE.DataTexture(a, 16, 16, THREE.RGBAFormat, THREE.FloatType);
3) 设置“设置场景”(它应该将数据纹理传递给它一次) setUniforms = { posTexture:{类型:“t”,值:posTexture [2]} };
var setMaterial = new THREE.ShaderMaterial({
uniforms: setUniforms,
vertexShader: document.getElementById('setVert').textContent,
fragmentShader: document.getElementById('setFrag').textContent,
wireframe: true
});
var setPlane = new THREE.Mesh(new THREE.PlaneGeometry(16,16), setMaterial);
setScene.add(setPlane);
4) 设置着色器。
<script type="x-shader/x-vertex" id="setVert">
// switch on high precision floats
#ifdef GL_ES
precision highp float;
#endif
varying vec2 vUv;
uniform sampler2D posTexture;
void main(){
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);
}
</script>
<script type="x-shader/x-fragment" id="setFrag">
#ifdef GL_ES
precision highp float;
#endif
uniform sampler2D posTexture;
varying vec2 vUv;
void main(){
vec3 color = texture2D( posTexture, vUv ).xyz;
gl_FragColor = vec4(col, 1.0);
}
</script>
5) 动画它!!! start 设置 SetShader 以保存数据并将 WebGLRenderTarget 输出到下一个着色器:一个负责计算并返回带有坐标的纹理,下一个用于显示
function animate() {
requestAnimationFrame(animate);
renderer.setViewport(0,0,16, 16);
if(buffer == 0) {
buffer = 1;
a = 0;
b = 1;
} else {
buffer = 0;
a = 1;
b = 0;
}
if(start) {
renderer.render(setScene, processCamera, posTexture[a]);
start = false;
}
posUniforms.posTexture.value = posTexture[a];
renderer.render(posScene, processCamera, posTexture[b])
dispUniforms.posTexture.value = posTexture[b];
renderer.setViewport(0,0,dispSize.x, dispSize.y);
renderer.render(scene, camera);
}
【问题讨论】:
-
一方面,您的片段着色器甚至不应该编译(
col未定义)。另外,一个RGBA纹理是Unsigned归一化的;您通常不希望将顶点位置直接吐到这种纹理中,因为您将丢失任何 0.5 并在将位置写入gl_FragColor之前添加 0.5 以输出到纹理。 -
那么这个位置是怎么保存的呢? chromeexperiments.com/detail/one-million-particles/?f=
标签: javascript three.js textures shader