【发布时间】:2016-03-06 12:14:30
【问题描述】:
我在我的场景中添加了一个简单的盒子,我想创建一个着色器,它会为其添加纹理并为该纹理添加颜色。
这是我的顶点着色器(没什么特别的):
<script id="vertexShader" type="x-shader/x-vertex">
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);
}
</script>
这是我的片段着色器:
<script id="fragmentShader" type="x-shader/x-fragment">
uniform vec2 resolution;
uniform float time;
uniform sampler2D texture;
varying vec2 vUv;
uniform vec3 color;
varying vec3 vColor;
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord.xy / vec2(1920.0, 1920.0);
fragColor = vec4(uv, 0.5 + 0.5 * cos(time) * sin(time) ,1.0);
}
void main( void ) {
vec4 color = vec4(0.0,0.0,0.0,1.0);
mainImage( color, gl_FragCoord.xy );
color.w = 1.0;
gl_FragColor = texture2D(texture, vUv);
gl_FragColor = color;
}
</script>
如您所见,在最后两行中,我为 gl_FragColor 设置了纹理和颜色。
当最后一行是gl_FragColor = color; 结果是:
当我更改订单并且最后一行是 gl_FragColor = texture2D(texture, vUv); 结果是:
这是使用着色器并向场景添加框的代码:
var geometry = new THREE.BoxGeometry(.5, 1, .5);
uniforms = {
time: { type: "f", value: 1.0 },
resolution: { type: "v2", value: new THREE.Vector2() },
texture: { type: "t", value: THREE.ImageUtils.loadTexture("../img/disc.png") }
};
var material = new THREE.ShaderMaterial({
transparent: true,
uniforms: uniforms,
vertexShader: document.getElementById('vertexShader').textContent,
fragmentShader: document.getElementById('fragmentShader').textContent
});
var mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
是否有可能通过此着色器以与图片中相同的方式为我的纹理着色(在对象中混合颜色和纹理)?
【问题讨论】:
标签: javascript three.js webgl