gpt4 book ai didi

opengl - gl_PointSize 对应世界空间大小

转载 作者:行者123 更新时间:2023-12-04 01:59:19 26 4
gpt4 key购买 nike

如果你想渲染一个冒名顶替的几何体(比如 a sphere ),那么标准做法是使用两个三角形来绘制它(比如通过一个顶点并使用几何着色器制作一个三角形 strip )。

这很好,因为它允许相当简单地设置广告牌的范围:您可以直接计算实际的世界空间位置。

几何着色器可以交替输出点图元,我看不出他们不应该这样做的原因。唯一的问题是找到一些方法来扩展 gl_PointSize让你得到那个效果。

我能找到的唯一先例是this question (我不确定他的答案是否正确)和this question (没有答案)。

值得注意的是,用距离正确缩放点相当简单(通过执行 gl_PointSize = constant/length(gl_Position) ,但这不是可控的;你不能说例如:我希望这个点看起来像两个世界单位。

所以:有人知道怎么做吗?

最佳答案

一个直截了当的想法是将粒子顶部和底部的一个点转换到屏幕空间并找到距离。这可以很好地取消,并且只使用 y 非常简单协调。

广告牌是屏幕对齐的,并且 View 矩阵通常不会缩放,因此世界空间中的粒子大小与眼睛空间相同。这只是将投影留给 NDC,除以 w并按视口(viewport)大小缩放。

一个典型的投影矩阵,P ,可能看起来像这样...

[ +1.2990 +0.0000 +0.0000 +0.0000 ]
[ +0.0000 +1.7321 +0.0000 +0.0000 ]
[ +0.0000 +0.0000 -1.0002 -0.0020 ]
[ +0.0000 +0.0000 -1.0000 +0.0000 ]

y_eye 开头,眼睛空间中的y坐标,图像空间坐标 y_image以像素为单位...

enter image description here

插入广告牌上方/下方的半径并减去取消...

enter image description here

或者,在文本中, pixelSize = vpHeight * P[1][1] * radius / w_clip

对于透视投影, P[1][1] = 1 / tan(fov_y / 2) . w_clipgl_Position.w ,这也是 -z_eye (来自透视矩阵中的 -1)。为保证您的点涵盖您想要的每个像素,这可能需要一个额外的小常数。

旁注:广告牌上的球体在屏幕中间看起来不错。如果您有大视野透视投影,则真正的球体在接近屏幕边缘时应该会变形。您可以为广告牌中的每个像素隐式转换虚拟球体以获得正确的结果,但广告牌边界需要相应调整。快速谷歌搜索结果: 1 2 3 4

[编辑]
好吧,既然我费心测试这个,我也会把我的着色器扔在这里......

顶点:
#version 150

in vec4 osVert;

uniform mat4 projectionMat;
uniform mat4 modelviewMat;
uniform vec2 vpSize;

flat out vec2 centre;
flat out float radiusPixels;

const float radius = 1.0;

void main()
{
gl_Position = projectionMat * modelviewMat * osVert;
centre = (0.5 * gl_Position.xy/gl_Position.w + 0.5) * vpSize;
gl_PointSize = vpSize.y * projectionMat[1][5] * radius / gl_Position.w;
radiusPixels = gl_PointSize / 2.0;
}

分段:
#version 150

flat in vec2 centre;
flat in float radiusPixels;

out vec4 fragColour;

void main()
{
vec2 coord = (gl_FragCoord.xy - centre) / radiusPixels;
float l = length(coord);
if (l > 1.0)
discard;
vec3 pos = vec3(coord, sqrt(1.0-l*l));
fragColour = vec4(vec3(pos.z), 1.0);
}

enter image description here

(请注意右下角的可见间隙如上所述是不正确的)

关于opengl - gl_PointSize 对应世界空间大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25780145/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com