OpenGL 启用剪辑距离

标签 opengl glsl vertex-shader clip

我试图在我的 OpenGL 项目中渲染适当的折射/反射,我需要使用裁剪距离。我正在按照 Thin Matrix 的教程进行操作.

我启用剪辑距离

glEnable(GL_CLIP_DISTANCE0);

在我的游戏循环中,然后我尝试像这样在顶点着色器中使用它

gl_ClipDistance[0] = -1;

我试图改变 -1 值,但无论我做什么都没有任何反应。我还需要做些什么才能正确启用它吗?

最佳答案

gl_ClipDistance 数组包含一系列浮点值,表示每个顶点位于概念“平面”的哪一侧。每个数组索引都是一个概念上的“平面”。顶点可以在负边,也可以在非负边。

如果同一直线/三角形的两个顶点在平面的两个不同边上(即一个顶点具有负值,另一个顶点为非负值),则图元将在该位置被裁剪该距离为 0。图元在非负侧的部分将可见。

鉴于此,您需要做的是设置一个裁剪距离值,该值表示顶点位置与要裁剪的平面之间的距离。标准平面方程 (Ax + By + Cz + D = 0) 为我们提供了一种处理此问题的方法。假设向量 (A, B, C) 是单位向量,点到平面 A、B、C、D 的距离很简单:

dot(point, vec3(A, B, C)) + D

这还假设 point 与 A、B、C 和 D 在同一空间中。

当然,如果point是一个vec4,最后一个组件为1.0,那么你可以这样做:

dot(point, plane);

plane 是一个包含 A、B、C 和 D 的 vec4。这就是你的剪辑距离。

您还需要在使用它的着色器阶段使用明确的大小重新声明 gl_ClipDistance。在 GLSL 3.20+ 中,gl_ClipDistance 位于接口(interface) block 中,因此您必须重新声明:

out gl_PerVertex
{
  vec4 gl_Position;
  float gl_ClipDistance[1];
};

关于OpenGL 启用剪辑距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45650325/

相关文章:

c++ - glAttribLocation 返回 -1,即使顶点着色器正在积极使用它

c++ - 椭圆绘图

c++ - 使用 glMapBuffer 用一个缓冲区渲染多个对象?

glsl - 使用 gl_FragCoord 在四边形中创建一个洞

这个基类的 C# 子类?

java - OpenGL 顶点着色器不工作

c++ - 用于替换顶点属性的 Opengl 着色器存储缓冲区对象

opengl - 什么会导致 glCreateShader 在某些时候返回 0?

reactjs - 如何为缓冲区几何中的每个顶点分配不同的颜色?三.js

glsl - 如何在 GLSL 结构体中初始化数组