我只是不明白为什么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)"and"gl_ClipDistance=-1.0“,但让我困惑的是,我的模型仍然停留在那里,没有消失。
有人知道这是怎么发生的吗?
发布于 2014-06-21 04:56:31
我通过应用程序设置了
glEnable(GL_CLIP_DISTANCE0+2)。
但不是GL_CLIP_DISTANCE0和GL_CLIP_DISTANCE1。
写入未启用的
gl_ClipDistance平面中的值没有任何效果。
如果您打算写入GL_CLIP_DISTANCE0和gl_ClipDistance[1],则启用gl_ClipDistance[0]和gl_ClipDistance[1]。
发布于 2014-06-21 19:34:21
您在这里调用未定义的行为。
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。如果使用常量整数表达式对数组进行索引(正如使用和1时所做的那样),GLSL会自动调整数组的大小,但它只将数组调整为2,而不是3。
https://stackoverflow.com/questions/24338338
复制相似问题