我使用简单的圆形绘制着色器在OpenGL中绘制一个圆圈,该着色器在传入的点周围绘制一个圆。该点需要在x和y中的屏幕空间坐标i,e,1到-1中。 / p>
问题在于绘制的圆不会像真正的太阳一样停留在相同的位置,与场景中的其他对象相比,它似乎过度旋转。这是因为它与SkyBox不同步。
传递到SkyBox的矩阵是:
m_activeCamera.m_projectionMatrix *
m_activeCamera.m_viewMatrix *
glm::translate(mat4(1.0), m_activeCamera.m_position));
到目前为止,对太阳光位置的计算:
vec4 returnPos = pos;
returnPos.w = 1.0f;
returnPos = projection * (view * returnPos);
return vec2(returnPos.x / returnPos.w, returnPos.y / returnPos.w);
传递给此函数(pos)的位置是:
SUN.position + m_activeCamera.position
视图和投影矩阵属于m_activeCamera。
帮助解释问题的图片:
如果我将相机从左向右移动,则太阳相对于天空盒保持原位。
如果我旋转相机,太阳会与天空盒一起移出。
答案 0 :(得分:0)
问题在于" GetNDCCoords"如果当然太阳在屏幕上,函数在X和Y中返回-1和1之间的点。绘制圆的函数需要在屏幕空间0到1中的位置。这可以通过一个简单的公式解决:
screenPos.x = NDC.x * 0.5 + 0.5;
screenPos.y = NDC.y * 0.5 + 0.5;
现在太阳保持固定。