标准全屏四重设置在 Three.js 中不起作用

use*_*142 4 html javascript three.js

我正在尝试使用 THREE.js 中的直通顶点着色器建立一个全屏四边形。四边形本身是一个平面几何体,尺寸 (2, 2) 位于原点。它被分配了 ShaderMaterial。相机瞄准z = 1四边形。

着色器非常简单:

顶点着色器:

void main() {
   gl_Position = vec4( position, 1.0 );
}
Run Code Online (Sandbox Code Playgroud)

片段着色器:

void main() {
   gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

但屏幕上什么也没有显示。此设置是渲染到纹理的标准方法,为什么它在 THREE.js 中不起作用?

我尝试过plane.frustumCulled = false更改相机的剪辑平面,但无济于事。

任何帮助表示赞赏。


经过进一步调查,看不到渲染结果的原因更为复杂,并指出了 Three.js 中的一些奇怪行为。

我使用的是应用了旋转矩阵的 PlaneGeometry,然后由具有反向旋转的 Object3D 包裹。

var geometry = new THREE.PlaneGeometry(2, 2);
var m4 = new THREE.Matrix4().makeRotationX(Math.PI * 0.5);
geometry.applyMatrix(m4);

var mesh = new THREE.Mesh(geometry, material);
var obj = new THREE.Object3D();
obj.add(mesh);
obj.rotation.x = -Math.PI * 0.5;
scene.add(obj);
Run Code Online (Sandbox Code Playgroud)

此设置似乎使 Three.js 失效,并且没有显示渲染。


好的,旋转被丢弃了,因为它是我在顶点着色器中忽略的模型视图矩阵的一部分。我必须重新审视我目前正在做的事情。

Bre*_*ble 5

我不确定您遇到的确切问题,但这里是使用相同技术的工作全屏四边形的示例。

var canvas = document.getElementById('canvas');
var scene = new THREE.Scene();
var renderer = new THREE.WebGLRenderer({canvas: canvas, antialias: true});
var camera = new THREE.PerspectiveCamera(45, canvas.clientWidth / canvas.clientWidth, 1, 1000);
var clock = new THREE.Clock();

var quad = new THREE.Mesh(
  new THREE.PlaneGeometry(2, 2),
  new THREE.ShaderMaterial({
    vertexShader: document.getElementById('vertex-shader').textContent,
    fragmentShader: document.getElementById('fragment-shader').textContent,
    depthWrite: false,
    depthTest: false
  })
);
scene.add(quad);

var box = new THREE.Mesh(
  new THREE.BoxGeometry(50, 50, 50),
  new THREE.MeshBasicMaterial({color: '#000', wireframe: true})
);
scene.add(box);

camera.position.z = 200;

render();

function render() {
  requestAnimationFrame(render);
  
  if (canvas.width !== canvas.clientWidth || canvas.height !== canvas.clientHeight) {
    renderer.setSize(canvas.clientWidth, canvas.clientHeight, false);
    camera.aspect = canvas.clientWidth /  canvas.clientHeight;
    camera.updateProjectionMatrix();
  }
  
  var dt = clock.getDelta();
  box.rotation.x += dt * 2 * Math.PI / 5;
  box.rotation.y += dt * 2 * Math.PI / 7;
  box.rotation.z += dt * 2 * Math.PI / 11;
  
  renderer.render(scene, camera);
}
Run Code Online (Sandbox Code Playgroud)
html, body, #canvas {
  margin: 0;
  padding: 0;
  width: 100%;
  height: 100%;
  display: block;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r73/three.min.js"></script>
<canvas id="canvas"></canvas>
<script id="vertex-shader" type="x-shader/x-vertex">
  varying vec2 vUv;

  void main() {
    vUv = uv;
    gl_Position = vec4(position, 1.0);
  }
</script>
<script id="fragment-shader" type="x-shader/x-fragment">
  varying vec2 vUv;

  void main() {
    gl_FragColor = vec4(vUv, 0.0, 1.0);
  }
</script>
Run Code Online (Sandbox Code Playgroud)