为什么gl_ClipDistance []不起作用?

时间:2014-06-21 04:38:15

标签: opengl glsl vertex-shader

我只是无法理解为什么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”,但令我困惑的是我的模型仍然停留在那里,并没有消失。

有人知道这是怎么发生的吗?

2 个答案:

答案 0 :(得分:1)

  

我已按应用程序设置了glEnable(GL_CLIP_DISTANCE0+2)

但不是GL_CLIP_DISTANCE0GL_CLIP_DISTANCE1

来自gl_ClipDistance

  

写入gl_ClipDistance平面但未启用的值无效。

如果您打算写信至GL_CLIP_DISTANCE0GL_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