我只是无法理解为什么gl_ClipDistance不起作用。结果与我没有设置gl_ClipDistance相同。
我已经按应用程序设置了glEnable(GL_CLIP_DISTANCE0 + 2)。
顶点着色器是这样的:
#version 410
uniform mat4 mvpMatrix;
//.......some other uniforms here
in vec2 vVertex;
uniform vec4 clip_plane=vec4(1.0,1.0,0.0,0.85);
uniform vec4 clip_sphere=vec4(0.0,0.0,0.0,10.0);
void main(void)
{
//........some other code,include vec2 worldPos
vec4 worldPosition=vec4(worldPos.x,height,worldPos.y,1.0);
gl_ClipDistance[0]=dot(worldPosition,clip_plane);
gl_ClipDistance[1]=length(worldPosition.xyz/worldPosition.w-clip_sphere.xyz)-clip_sphere.w;
gl_Position = mvpMatrix * position;
}
PS:在被好人告知之后,我知道“glEnable(GL_CLIP_DISTANCE0 + 2)”是不对的。所以我设置“glEnable(GL_CLIP_DISTANCE0); glEnable(GL_CLIP_DISTANCE1);”,但它仍然无效。
然后,我试着只设置“glEnable(GL_CLIP_DISTANCE0)”和“gl_ClipDistance [0] = - 1.0”,但令我困惑的是我的模型仍然停留在那里,并没有消失。
有人知道这是怎么发生的吗?
答案 0 :(得分:1)
我已按应用程序设置了
glEnable(GL_CLIP_DISTANCE0+2)
。
但不是GL_CLIP_DISTANCE0
和GL_CLIP_DISTANCE1
。
写入
gl_ClipDistance
平面但未启用的值无效。
如果您打算写信至GL_CLIP_DISTANCE0
和GL_CLIP_DISTANCE1
,请启用gl_ClipDistance[0]
和gl_ClipDistance[1]
。
答案 1 :(得分:1)
GL_CLIP_DISTANCE0 + 2
实际上是gl_PerVertex.gl_ClipDistance [...]
中的第三个剪辑距离。
名称
gl_ClipDistance
- 为顶点剪裁提供向前兼容的机制描述
[...]
gl_ClipDistance
消耗的各种组件的数量将与阵列的大小匹配,无论启用多少个平面。 着色器还必须设置gl_ClipDistance
中已通过OpenGL API启用的所有值,否则结果未定义。 写入gl_ClipDistance
个平面的值未启用的功能无效。
由于您已对gl_ClipDistance [2]
启用剪切但未向其写入任何内容,因此每顶点输出实际上只是 2 剪辑距离的数组,而第三个是未定义的。剪切未定义的内容会产生不可预测的行为。
要求对阵列进行调整以包含启用率最高的剪裁平面。这意味着如果您启用GL_CLIP_DISTANCE2
,则gl_ClipDistance []
的大小必须为 3 。如果使用常量整数表达式对其进行索引(如使用 0 和 1 时所做的那样),GLSL会自动调整该数组的大小,但它只会将其大小调整为<strong> 2 ,而不是 3 。