如何保持 Opengl Scatter Instances 大小不变?
How to keep Opengl Scatter Instances size unchanged?
这是我的问题,我将列出它们以使其清楚:
- 我正在编写一个程序,使用实例在 2D 中绘制正方形。
- 我的相机方向是(0,0,-1),相机向上是(0,1,0),相机位置是(0,0,3),当我按下一些键时相机位置会改变.
- 我想要的是,当我放大(相机靠近正方形)时,正方形的大小(在屏幕上)不会改变。所以在我的着色器中:
#version 330 core
layout(location = 0) in vec2 squareVertices;
layout(location = 1) in vec4 xysc;
out vec4 particlecolor;
uniform mat4 VP;
void main()
{
float particleSize = xysc.z;
float color = xysc.w;
gl_Position = VP* vec4(xysc.x, xysc.y, 2.0, 1.0) + vec4(squareVertices.x*particleSize,squareVertices.y*particleSize,0,0);
particlecolor = vec4(1.0f * color , 1.0f * (1-color), 0.0f, 0.5f);
}
请注意,为了保持正方形的大小不变,我做的是:
1. transform the center of the square first
VP * vec4(xysc.x, xysc.y, 2.0, 1.0)
2. then compute one of the four corners (x,y,z,1) of the square
+ vec4(squareVertices.x*particleSize,squareVertices.y*particleSize,0,0);
而不是:
gl_Position = VP* (vec4(xysc.x, xysc.y, 2.0, 1.0) + vec4(squareVertices.x*particleSize,squareVertices.y*particleSize,0,0));
然而,当我将相机移近 z=0 平面时。正方形的大小意外增长。问题出在哪里?如果需要我可以提供演示代码。
听起来你使用的是透视投影,你在步骤 1 和 2 中使用的公式将不起作用,因为 VP * vec4 在一般情况下会导致 vec4(x,y,z,w)
和 w
值 != 1
,并向其添加 vec4(a,b,0,0)
只会让你在透视分割后得到 vec3( (x+a)/w, (y+b)/w, z)
,而你似乎想要 vec3(x/w + a, y/w +b, z)
。所以正确的方法是将 a
和 b
缩放 w
并在 divde 之前添加:vec4(x+a*w, y+b*w, z, w)
.
请注意,当您将相机移近几何体时,有效 w
值将趋近于零,因此 (x+a)/w
将大于 x/w + a
,从而导致您几何图形变大了。
这是我的问题,我将列出它们以使其清楚:
- 我正在编写一个程序,使用实例在 2D 中绘制正方形。
- 我的相机方向是(0,0,-1),相机向上是(0,1,0),相机位置是(0,0,3),当我按下一些键时相机位置会改变.
- 我想要的是,当我放大(相机靠近正方形)时,正方形的大小(在屏幕上)不会改变。所以在我的着色器中:
#version 330 core
layout(location = 0) in vec2 squareVertices;
layout(location = 1) in vec4 xysc;
out vec4 particlecolor;
uniform mat4 VP;
void main()
{
float particleSize = xysc.z;
float color = xysc.w;
gl_Position = VP* vec4(xysc.x, xysc.y, 2.0, 1.0) + vec4(squareVertices.x*particleSize,squareVertices.y*particleSize,0,0);
particlecolor = vec4(1.0f * color , 1.0f * (1-color), 0.0f, 0.5f);
}
请注意,为了保持正方形的大小不变,我做的是:
1. transform the center of the square first
VP * vec4(xysc.x, xysc.y, 2.0, 1.0)
2. then compute one of the four corners (x,y,z,1) of the square
+ vec4(squareVertices.x*particleSize,squareVertices.y*particleSize,0,0);
而不是:
gl_Position = VP* (vec4(xysc.x, xysc.y, 2.0, 1.0) + vec4(squareVertices.x*particleSize,squareVertices.y*particleSize,0,0));
然而,当我将相机移近 z=0 平面时。正方形的大小意外增长。问题出在哪里?如果需要我可以提供演示代码。
听起来你使用的是透视投影,你在步骤 1 和 2 中使用的公式将不起作用,因为 VP * vec4 在一般情况下会导致 vec4(x,y,z,w)
和 w
值 != 1
,并向其添加 vec4(a,b,0,0)
只会让你在透视分割后得到 vec3( (x+a)/w, (y+b)/w, z)
,而你似乎想要 vec3(x/w + a, y/w +b, z)
。所以正确的方法是将 a
和 b
缩放 w
并在 divde 之前添加:vec4(x+a*w, y+b*w, z, w)
.
请注意,当您将相机移近几何体时,有效 w
值将趋近于零,因此 (x+a)/w
将大于 x/w + a
,从而导致您几何图形变大了。