gpt4 book ai didi

javascript - 如何在 THREE.js 中将自定义着色器应用于 Sprite

转载 作者:行者123 更新时间:2023-12-04 22:46:25 24 4
gpt4 key购买 nike

我希望能够将一些程序结构应用于面部。当我面临这样的需求时,第一个任务是创建广告牌,上面画着开放空间中的核爆炸。我希望把它做成一个动画径向渐变,我已经部分成功了。

最主要的是每个片段着色器 - 可以访问 UV至于统一变量。

似乎渲染 Sprite 的主要内容是访问顶点着色器中的相机投影矩阵。

这是示例 http://goo.gl/A7pY01 !

现在我想把它画到广告牌 Sprite 上。我应该使用 THREE.Sprite为此,请使用 THREE.ShaderMaterial ,但在这方面没有运气。看来,THREE.SpriteMaterial只是 Sprite 的好 Material 。在检查了一些源代码后,我揭示了为什么 Sprites 是使用插件以一种特殊的方式绘制的。

所以,在我发现自己发明了自己的自行车之前,我觉得有必要问问人们如何在不修改 THREE.js 的情况下将我自己的自定义着色器放置在我自己的自定义 Sprite 上?

最佳答案

所以。
经过一些小的研究和工作,我考虑了THREE.ShaderMaterial是完成这个小任务的最佳选择。感谢 /extras/renderers/plugins/SpritePlugin ,我意识到如何使用顶点着色器来形成和定位 Sprite 。我还有一些问题,但我找到了一个很好的解决方案。

为了完成我的任务,首先我创建了一个简单的平面几何:

 var geometry = new THREE.PlaneGeometry( 1, 1 );

并将其与 ShaderMaterial 一起用于网格中:
            uniforms = {
cur_time: {type:"f", value:1.0},
beg_time:{type:"f", value:1.0},
scale:{type: "v3", value:new THREE.Vector3()}
};

var material = new THREE.ShaderMaterial( {

uniforms: uniforms,
vertexShader: document.getElementById( 'vertexShader' ).textContent,
fragmentShader: document.getElementById( 'fragmentShader' ).textContent,
transparent: true,
blending:THREE.AdditiveBlending // It looks like real blast with Additive blending!!!

} );


var mesh = new THREE.Mesh( geometry, material );

这是我的着色器:
顶点着色器:
        varying vec2 vUv;
uniform vec3 scale;

void main() {
vUv = uv;
float rotation = 0.0;

vec3 alignedPosition = vec3(position.x * scale.x, position.y * scale.y, position.z*scale.z);

vec2 pos = alignedPosition.xy;

vec2 rotatedPosition;
rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;
rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;

vec4 finalPosition;

finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );
finalPosition.xy += rotatedPosition;
finalPosition = projectionMatrix * finalPosition;

gl_Position = finalPosition;

}

我从原始 Sprite Plugin 源代码中获得了顶点着色器,并对其稍作更改。
顺便说一句,更改 +==使 Sprite 屏幕粘性。这件事浪费了我很多时间。

这是我的片段着色器:
        uniform float cur_time;
uniform float beg_time;

varying vec2 vUv;

void main() {
float full_time = 5000.;

float time_left = cur_time - beg_time;
float expl_step0 = 0.;
float expl_step1 = 0.3;
float expl_max = 1.;

float as0 = 0.;
float as1 = 1.;
float as2 = 0.;

float time_perc = clamp( (time_left / full_time), 0., 1. ) ;
float alphap;
alphap = mix(as0,as1, smoothstep(expl_step0, expl_step1, time_perc));
alphap = mix(alphap,as2, smoothstep(expl_step1, expl_max, time_perc));


vec2 p = vUv;
vec2 c = vec2(0.5, 0.5);
float max_g = 1.;
float dist = length(p - c) * 2. ;

float step1 = 0.;
float step2 = 0.2;
float step3 = 0.3;

vec4 color;
float a0 = 1.;
float a1 = 1.;
float a2 = 0.7;
float a3 = 0.0;


vec4 c0 = vec4(1., 1., 1., a0 * alphap);
vec4 c1 = vec4(0.9, 0.9, 1., a1 * alphap);
vec4 c2 = vec4(0.7, 0.7, 1., a2 * alphap);
vec4 c3 = vec4(0., 0., 0., 0.);



color = mix(c0, c1, smoothstep(step1, step2, dist));
color = mix(color, c2, smoothstep(step2, step3, dist));
color = mix(color, c3, smoothstep(step3, max_g, dist));

gl_FragColor = color;
}

这是如何制作多点渐变的示例,按时间设置动画。有很多需要优化的地方,还有一些想法如何让它变得更漂亮。

但这几乎是我想要的。

关于javascript - 如何在 THREE.js 中将自定义着色器应用于 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24259404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com