我需要在OpenGL ES 2.0的裁剪平面下裁剪几百个对象,并且希望从对这部分OpenGL有更多经验的人那里得到启发。
在OpenGL ES 1.x中,有glClipPlane。在桌面上,着色器中具有glClipPlane或gl_ClipDistance。在OpenGL ES 2.0中,这两个都不可用。似乎这种功能在2.0中完全消失了。
看来唯一的方法是A)在片段着色器中运行平面方程,或B)编写一个非常复杂的顶点着色器,如果顶点在平面上,则将顶点放置在平面上。
(A)与glClipPlane相比要慢一些,因为“常规”裁剪是在顶点着色器之后和片段着色器之前完成的,所以每个片段仍必须部分处理并丢弃。
(B)将很难使着色器之间兼容,因为我们不能丢弃顶点,因此必须将它们与平面对齐并为“剪切”的顶点调整属性。如果不将所有顶点发送到纹理中并对其进行采样,则无法在着色器的顶点之间进行插值,这将非常昂贵。无论如何,通常不可能正确地插值数据。
我还考虑过将近平面与裁剪平面对齐,这将是一种有效的解决方案。
并且在渲染整个场景并检查深度失败后绘制平面也将不起作用(除非您看起来与平面垂直)。
对单个对象起作用的方法是将平面绘制到深度缓冲区,然后使用glDepthFunc(GL_GREATER)渲染该对象,但是正如预期的那样,当其中一个对象位于另一个对象之后时,它将不起作用。我试图以此概念为基础,但最终得到了与影子卷非常相似且价格昂贵的东西。
那我想念什么呢?您将如何在OpenGL ES 2.0中进行平面裁剪?
最佳答案
这是我在Vuforia SDK forums上找到的两个解决方案。
uniform mat4 uModelM;
uniform mat4 uViewProjectionM;
attribute vec3 aPosition;
varying vec3 vPosition;
void main() {
vec4 pos = uModelM * vec4(aPosition, 1.0);
gl_Position = uViewProjectionM * pos;
vPosition = pos.xyz / pos.w;
}
precision mediump float;
varying vec3 vPosition;
void main() {
if (vPosition.z < 0.0) {
discard;
} else {
// Choose actual color for rendering..
}
}
关于opengl-es - OpenGL ES 2.0中的剪切平面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7408855/