【发布时间】:2013-12-19 12:41:24
【问题描述】:
当我以与在顶点着色器中相同的方式计算 gl_PointSize 时,我得到一个“以像素为单位”的值(根据http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_PointSize.xml)。然而,这个值与屏幕上点的测量宽度和高度不匹配。 计算出来的尺寸和测量出来的尺寸之间的差异似乎不是恒定的。
计算值范围从 1(非常远)到 4(非常近)
当前代码(使用三个.js,但没什么神奇的),试图计算屏幕上一个点的大小:
var projector = new THREE.Projector();
var width = window.innerWidth, height = window.innerHeight;
var widthHalf = width / 2, heightHalf = height / 2;
var vector = new THREE.Vector3();
var projector = new THREE.Projector();
var matrixWorld = new THREE.Matrix4();
matrixWorld.setPosition(focusedArtCluster.object3D.localToWorld(position));
var modelViewMatrix = camera.matrixWorldInverse.clone().multiply( matrixWorld );
var mvPosition = (new THREE.Vector4( position.x, position.y, position.z, 1.0 )).applyMatrix4(modelViewMatrix);
var gl_PointSize = zoomLevels.options.zoom * ( 180.0 / Math.sqrt( mvPosition.x * mvPosition.x + mvPosition.y * mvPosition.y + mvPosition.z * mvPosition.z ) );
projector.projectVector( vector.getPositionFromMatrix( matrixWorld ), camera );
vector.x = ( vector.x * widthHalf ) + widthHalf;
vector.y = - ( vector.y * heightHalf ) + heightHalf;
console.log(vector.x, vector.y, gl_PointSize);
让我澄清一下: 目标是获取一个点的屏幕大小,以像素为单位。
我的顶点着色器:
vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
gl_PointSize = zoom * ( 180.0 / length( mvPosition.xyz ) );
gl_Position = projectionMatrix * mvPosition;
【问题讨论】:
-
好的,既然这里有无数个变量,我真的不知道你想给
gl_PointSize分配什么值。您能给我一些关于您将使用此代码计算的值范围的线索吗?请记住,OpenGL 实现只需要支持 1.0 - 1.0 的范围(是的,可悲的是,这不是开玩笑)。你可以通过调用glGetIntegerv (GL_POINT_SIZE_RANGE, ...)来查询你的实现支持的范围,当然我不能开始告诉你如何在 Three.js 中做到这一点。一个好的经验法则是,由于 NV 和 AMD 卡最多只支持 64... -
您可能不应该期望嵌入式实现支持任何大于 64 的值 =P 通常您会查询该值而不是按照这种愚蠢的经验法则,但我不知道如何从 Three.js 获取该信息。
-
nm,我看到你已经这样做了。我认为您的问题文本中的这些数字是测量尺寸,但这些是实际计算的尺寸。不过,我会考虑查看您的实现对最大点大小的限制。它可能会将您的范围限制在 1.0。
-
感谢您的帮助。 webglreport.com“别名点大小范围:[1, 256]”。夹紧不是问题。问题是我从来没有收到一个点的实际屏幕尺寸。这些点的大小不是 1 到 3 像素,而是 10 到 60 像素。所以现在我不确定如何计算实际的屏幕尺寸。
-
屏幕尺寸和计算尺寸之间的系数是 69 计算尺寸 4 和测量尺寸 276 和 12 计算尺寸 1.386 和测量尺寸 17