无法从THREE.js / GLSL代码获得预期结果

benjia

对于这个模糊的问题表示歉意,但我不确定该如何表达。我正在尝试编写一些THREE.js / GLSL代码,以生成圆形渐变(适用于某些SDF东西)。在下面的代码中,我希望看到飞机上的渐变,但是飞机仍然是白色的,并且没有其他物体渲染。谁能告诉我我要去哪里错了?

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>My first three.js app</title>
        <style>
            body { margin: 0; }
            canvas { width: 100%; height: 100% }
        </style>
    </head>
    <body>
        <script type="x-shader/x-vertex" id="sdfVS">
            varying vec2 vUv; // pass the uv coordinates of each pixel to the frag shader

            void main() {
              vUv = uv;
              gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
            }
        </script>
        <script type="x-shader/x-fragment" id="sdfFS">
            precision mediump float;
            uniform vec2 u_resolution;
            varying vec2 vUv;

            float circle(vec2 pos, float radius)
            {
                return distance(pos, vec2(radius));
            }

            void main()
            {
                vec2 pos = (gl_FragCoord.xy / vUv) * 2.0 - 1.0;
                float circle1 = circle(pos, 0.5);
                vec3 color = vec3(circle1);
                gl_FragColor = vec4(color, 1.0);
            }
        </script>
        <script src="../../js/three.min.js"></script>
        <script>
            var scene, camera, renderer, aspect, geometry, material, plane;
            var container;
            var frustumSize = 2;

            init();
            animate();

            function init() {
                container = document.createElement( 'div' );
                document.body.appendChild( container );

                scene = new THREE.Scene();
                scene.background = new THREE.Color(0x0000ff);

                aspect = window.innerWidth / window.innerHeight;
                camera = new THREE.OrthographicCamera( 0.5 * frustumSize * aspect / - 2, 0.5 * frustumSize * aspect / 2, frustumSize / 2, frustumSize / - 2, 0.1, 1 );
                cameraOrthoHelper = new THREE.CameraHelper( camera );
                scene.add( cameraOrthoHelper );

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

                material = new THREE.ShaderMaterial( {
                    vertexShader: document.getElementById('sdfVS').textContent,
                    fragmentShader: document.getElementById('sdfFS').textContent,
                    side: THREE.DoubleSide
                } );

                plane = new THREE.Mesh( geometry, material );
                plane.rotation.x = 0;
                plane.rotation.y = THREE.Math.degToRad( -90 );
                plane.rotation.z = 0;
                scene.add( plane )

                renderer = new THREE.WebGLRenderer();
                renderer.setPixelRatio( window.devicePixelRatio );
                renderer.setSize( window.innerWidth, window.innerHeight );
                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() {
                camera.position.x = -1;
                camera.position.y = 0;
                camera.position.z = 0;
                camera.lookAt( scene.position );
                camera.updateMatrixWorld();
                renderer.render( scene, camera );
            }
        </script>
    </body>
</html>
囚犯849

无法获得此行:

vec2 pos = (gl_FragCoord.xy / vUv) * 2.0 - 1.0;

似乎您想计算uv坐标,但是如果这样,则您已经有了uvs(传入vUv)。

您可以通过以下方式进行操作:

var scene, camera, renderer, aspect, geometry, material, plane;
var container;
var clock = new THREE.Clock();
var frustumSize = 2;

init();
animate();

function init() {
  container = document.createElement('div');
  document.body.appendChild(container);

  scene = new THREE.Scene();
  scene.background = new THREE.Color(0x0000ff);

  aspect = window.innerWidth / window.innerHeight;
  camera = new THREE.OrthographicCamera(0.5 * frustumSize * aspect / -2, 0.5 * frustumSize * aspect / 2, frustumSize / 2, frustumSize / -2, 0.1, 1);
  cameraOrthoHelper = new THREE.CameraHelper(camera);
  scene.add(cameraOrthoHelper);

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

  material = new THREE.ShaderMaterial({
  	uniforms: {time: {value: 0}},
    vertexShader: document.getElementById('sdfVS').textContent,
    fragmentShader: document.getElementById('sdfFS').textContent,
    side: THREE.DoubleSide
  });

  plane = new THREE.Mesh(geometry, material);
  plane.rotation.x = 0;
  plane.rotation.y = THREE.Math.degToRad(-90);
  plane.rotation.z = 0;
  scene.add(plane)

  renderer = new THREE.WebGLRenderer();
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(window.innerWidth, window.innerHeight);
  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() {
  camera.position.x = -1;
  camera.position.y = 0;
  camera.position.z = 0;
  camera.lookAt(scene.position);
  camera.updateMatrixWorld();
  var t = clock.getElapsedTime();
  material.uniforms.time.value = t;
  renderer.render(scene, camera);
}
body {
  overflow: hidden;
  margin: 0;
}
<script src="https://threejs.org/build/three.min.js"></script>
<script type="x-shader/x-vertex" id="sdfVS">
  varying vec2 vUv; // pass the uv coordinates of each pixel to the frag shader

  void main() {
    vUv = uv;
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
  }
</script>
<script type="x-shader/x-fragment" id="sdfFS">
  precision mediump float;

  uniform float time;
  uniform vec2 u_resolution;
  varying vec2 vUv;

  float circle(vec2 uv, vec2 pos, float radius) {
    return smoothstep(radius, 0., length(uv - pos));
  }

  void main()
  {
    vec2 uv = vUv * 2. - 1.;
    vec2 pos = vec2(cos(time), sin(time));
    float circle1 = circle(uv, pos, 1.0);
    vec3 color = vec3(circle1);
    gl_FragColor = vec4(color, 1.0);
  }
</script>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法获得场景以Three.js呈现

来自分类Dev

THREE.js-导入的JSON网格上的morphTargetInfluences无法获得结果

来自分类Dev

无法从for循环获得预期结果

来自分类Dev

jsfiddle中的代码不起作用,无法在本地运行并获得预期结果

来自分类Dev

jsfiddle中的代码不起作用,无法在本地运行并获得预期的结果

来自分类Dev

JS代码无法按预期工作

来自分类Dev

在Node.js中使用async-await和promises时无法按预期顺序获得结果

来自分类Dev

three.js getWorldPosition未返回预期结果

来自分类Dev

PHP Strpos无法获得预期的结果

来自分类Dev

telteling转换无法获得预期的结果

来自分类Dev

CompletableFuture 实例无法获得预期结果

来自分类Dev

Three.js R68-无法使用OBJMTLLoader获得几何质心

来自分类Dev

Three.js r68-无法使用OBJMTLLoader获得几何形心

来自分类Dev

除非修改了源代码,否则Three.js骨骼动画无法正常工作

来自分类Dev

淘汰赛JS:无法看到预期的结果

来自分类Dev

THREE.js-无法在本地加载纹理

来自分类Dev

THREE.js OrbitControls无法正常工作

来自分类Dev

无法使Three.js相机向上

来自分类Dev

无法使用Three.js加载动画

来自分类Dev

无法在THREE.js中实施Skybox

来自分类Dev

无法在three.js中套用Matrix

来自分类Dev

Three.js Skybox无法加载

来自分类Dev

THREE.JS 无法加载 mtl 文件

来自分类Dev

无法在JS Web Scraping Cheerio中获得结果

来自分类Dev

无法获得Spring4D加密示例的预期结果

来自分类Dev

通过对特定语法进行解析无法获得预期的结果

来自分类Dev

在react-testing-library中无法从.toHaveBeenCalledTimes()获得预期结果

来自分类Dev

无法使用python代码在mapreduce中获得我的预期输出

来自分类Dev

无法使用Three.js导入OrbitControls.js

Related 相关文章

  1. 1

    无法获得场景以Three.js呈现

  2. 2

    THREE.js-导入的JSON网格上的morphTargetInfluences无法获得结果

  3. 3

    无法从for循环获得预期结果

  4. 4

    jsfiddle中的代码不起作用,无法在本地运行并获得预期结果

  5. 5

    jsfiddle中的代码不起作用,无法在本地运行并获得预期的结果

  6. 6

    JS代码无法按预期工作

  7. 7

    在Node.js中使用async-await和promises时无法按预期顺序获得结果

  8. 8

    three.js getWorldPosition未返回预期结果

  9. 9

    PHP Strpos无法获得预期的结果

  10. 10

    telteling转换无法获得预期的结果

  11. 11

    CompletableFuture 实例无法获得预期结果

  12. 12

    Three.js R68-无法使用OBJMTLLoader获得几何质心

  13. 13

    Three.js r68-无法使用OBJMTLLoader获得几何形心

  14. 14

    除非修改了源代码,否则Three.js骨骼动画无法正常工作

  15. 15

    淘汰赛JS:无法看到预期的结果

  16. 16

    THREE.js-无法在本地加载纹理

  17. 17

    THREE.js OrbitControls无法正常工作

  18. 18

    无法使Three.js相机向上

  19. 19

    无法使用Three.js加载动画

  20. 20

    无法在THREE.js中实施Skybox

  21. 21

    无法在three.js中套用Matrix

  22. 22

    Three.js Skybox无法加载

  23. 23

    THREE.JS 无法加载 mtl 文件

  24. 24

    无法在JS Web Scraping Cheerio中获得结果

  25. 25

    无法获得Spring4D加密示例的预期结果

  26. 26

    通过对特定语法进行解析无法获得预期的结果

  27. 27

    在react-testing-library中无法从.toHaveBeenCalledTimes()获得预期结果

  28. 28

    无法使用python代码在mapreduce中获得我的预期输出

  29. 29

    无法使用Three.js导入OrbitControls.js

热门标签

归档