缩放点距离的精灵

你如何通过距相机的距离来缩放点精灵

GLSL片段着色器: gl_PointSize = size / gl_Position.w; 似乎沿着正确的轨道; 对于任何给定的场景,所有的精灵看起来都很好地按距离缩放。 它是否正确?

你如何计算适合我的顶点属性size缩放比例? 我希望每个精灵都可以通过模型视图matrix进行缩放。

我曾经玩过任意值,看起来size是相机的像素半径,而不是模型视图比例。

我也试过:

 gl_Position = pMatrix * mvMatrix * vec4(vertex,1.0); vec4 v2 = pMatrix * mvMatrix * vec4(vertex.x,vertex.y+0.5*size,vertex.z,1.0); gl_PointSize = length(gl_Position.xyz-v2.xyz) * gl_Position.w; 

但是这使得精灵在远处更大,而不是更小:

在这里输入图像描述

回答我自己的问题,这是我的工作:

GLSL顶点着色器中的缩放比例是:

 gl_PointSize = (heightOfNearPlane * pointSize) / gl_Position.w; 

在使用视口高度和视野角度计算heightOfNearPlane地方,您使用以下方法构建了透视matrix:

 float fovy = 60; // degrees int viewport[4]; glGetIntegerv(GL_VIEWPORT,viewport); float heightOfNearPlane = (float)abs(viewport[3]-viewport[1]) / (2*tan(0.5*fovy*PI/180.0)); 

你作为制服通过你。

Thx到irc.freenode.net ## opengl上的编码器,帮助我解决这个问题!

我find了扩展PointSprites的解决scheme:

 const float SIZE_MULTIPLIER = 300.0; attribute float inSize; uniform vec2 g_Resolution; … vec4 modelSpacePos = vec4(inPosition, 1.0); vec4 position = g_WorldViewProjectionMatrix * modelSpacePos; #ifdef POINT_SPRITE // vec4 worldPos = modelSpacePos * modelSpacePos; float spriteDist; if (position.w == 0.0) { spriteDist = 0.00001; } else { spriteDist = position.w; } gl_PointSize = (((inSize * SIZE_MULTIPLIER * (g_Resolution.x/g_Resolution.y)) / spriteDist) * (g_Resolution.x/g_Resolution.y)); #endif 

这是我在jMonkey引擎上的谈话: http ://hub.jmonkeyengine.org/forum/topic/pointsprote-size-limitation/#post-250817