我有以下问题:我正在使用包含一组点的opengl绘制2D场景。每个点都指定它的XY坐标。我想使用标记符号 - 像三角形,十字形或四边形来渲染点。问题是缩放场景时标记大小应在屏幕上保持不变 - 例如使用GL_POINTS
。所以每次我改变比例时我都要重新计算我的标记坐标,这是不方便的 - 我想在获得新的渲染点位置时这样做一次。有什么问题吗?
答案 0 :(得分:1)
最简单的方法可能是你的符号有纹理,然后用点精灵绘制它们。如果你需要这种方法的帮助,我的答案解释了如何使用点精灵:
Render large circular points in modern OpenGL
我想到的另一种方法是在之后应用顶点着色器中的几何缩放,所有其他变换(包括投影)都已应用。
立刻想到的最好的是你将每个顶点的两个属性传递给顶点着色器:
然后在顶点着色器中,应用所有常用的变换,直到并包括投影变换,仅适用于中心。然后添加相对偏移量。
勾勒出顶点着色器,它可能如下所示:
in vec3 centerPos;
in vec2 relativePos;
uniform mat4 ModelViewProj;
...
void main() {
...
vec4 projCenterPos = ModelViewProj * vec4(centerPos, 1.0);
gl_Position = vec4(
projCenterPos.xy + projCenterPos.w * relativePos,
projCenterPos.zw);
}
由于在投影后应用了相对偏移,因此您必须考虑到我们现在具有同质坐标,其中x
,y
和z
将除以{ {1}}作为顶点着色器后固定函数处理的一部分。要在此透视分割后使大小保持不变,上面的代码会将偏移量乘以w
。
由于w
基本上应用于NDC(标准化设备坐标),其中x方向和y方向的范围是[-1.0,1.0],因此值必须相当小。例如,偏移量0.02对应于窗口大小的1%。
如果您希望调整更灵活,可以传入另一个比例因子来控制精灵的大小,并将relativePos
乘以上面计算中的因子。然后你可以保持相对位置,例如在[-1.0,1.0]的范围内,然后适当地缩小它们:
relativePos