【发布时间】:2018-08-07 09:18:06
【问题描述】:
在顶点着色器中顶点发生位移的情况下,如何在 WebGL / Three.js 中检索它们的变换位置?
Otherquestions这里建议将位置写入纹理然后读取像素,但结果值似乎不正确。
在下面的示例中,位置被传递给片段着色器而不进行任何转换:
// vertex shader
varying vec4 vOut;
void main() {
gl_Position = vec4(position, 1.0);
vOut = vec4(position, 1.0);
}
// fragment shader
varying vec4 vOut;
void main() {
gl_FragColor = vOut;
}
然后读取输出纹理,我希望pixel[0].r 与positions[0].x 相同,但事实并非如此。
这是一个显示问题的 jsfiddle: https://jsfiddle.net/brunoimbrizi/m0z8v25d/2/
我错过了什么?
【问题讨论】:
-
你的期望是错误的。当您对
gl_Position结果进行栅格化时,您会剪切您的网格。缓冲区中的 Pixel[0] 代表其他东西,与您的实际坐标相去甚远。顶点总是在某个 X,Y (width==4 / x == -2)。在屏幕上,您会看到 -1,-1 处的网格被插值,因此您的 -2,-2 不在屏幕上。如果您的宽度和高度大于 2,则数组中的最后一个像素应始终为 1,1。 -
我有点困惑,为什么左下角的数字不同,但我认为这取决于您的分辨率以及您如何设置该视图
-
@pailhead 确定网格被剪裁了吗?我还尝试将位置乘以模型视图和投影矩阵(第 32 行
gl_Position = modelViewMatrix * projectionMatrix * vec4(position, 1.0);),结果在 -2 和 2 之间,但仍然关闭。 -
好吧,这样想吧。制作尺寸为 1,1 的飞机。
gl_Position然后将获得 -0.5,0.5 范围,您应该会看到一个仅填充屏幕中心的平面。如果您将其设置为大于 2,2,您将获得剪辑空间之外的顶点。我认为奇怪的数字来自第一个像素处发生的插值,但我对小提琴有点困惑。
标签: three.js glsl fragment-shader vertex-shader