【问题标题】:OpenGL Planet Generation - Simple Matrix Issue (Planet "Spins" With Mouse)OpenGL 行星生成 - 简单矩阵问题(使用鼠标“旋转”行星)
【发布时间】:2015-05-19 09:46:44
【问题描述】:

我目前正在处理 OpenGL 行星渲染。我正在使用 Tessellation 管道。到目前为止,除了一个问题外,事情进展顺利。这是我多年来一直在努力的阶段,感觉好像没有进展。

首先here is a gif 我正在处理的事情。本质上,我的问题是,每当移动鼠标时,行星都会旋转,就好像它“看着”相机指向的位置一样。

有一些图形问题,但它们是由于我只是在整个立方体贴图上重复相同的高度图。由于两边不匹配,所以接缝清晰。

下面是我的评估着色器:

void main(void) {
    vec4 p0 = gl_in[0].gl_Position;
    vec4 p1 = gl_in[1].gl_Position;
    vec4 p2 = gl_in[2].gl_Position;
    vec3 p = gl_TessCoord.xyz;

    Normal_FS_in = mat3(transpose(inverse((MV)))) * (p0*p.x + (p1*p.y) + p2*p.z).xyz;

    float displacment = texture(tex1, Normal_FS_in).r * 800;
    gl_Position = MVP*(p0*p.x + (p1*p.y) + p2*p.z) + (vec4(vec3(displacment,displacment,0) * normalize(Normal_FS_in),1));
}

它非常简单。着色器计算输出顶点的法线。然后使用它从高度图(立方体贴图)中获取位移值。然后计算 GL_Position。我一直在努力解决的问题是我的问题是出在着色器还是在包的其余部分。

我的尝试主要是在修补。我已经将所有法线相关的东西移到了评估着色器中,而不是在顶点着色器中计算它并将它们传递给控制和评估着色器。

该问题仅在鼠标移动时出现。

任何建议都会很棒 - 希望我所需要的只是指向正确的方向。

编辑 - 对模型视图矩阵或视图矩阵进行逆转置会产生 gif 中的结果。当相机移动时,使用模型矩阵会导致法线失真,从而导致地形在该地点周围弯曲。

【问题讨论】:

  • 您知道,您可能gamedev.stackexchange.com 中得到更好的答案。不过这里也有话题。
  • 感谢您的建议 - 我在那边试一试。
  • 如果您决定在那里发帖,请阅读meta.stackexchange.com/questions/64068/…。另外:(p0*p.x + (p1*p.y) + p2*p.z).xyz 这看起来很时髦...您是否要插入镶嵌顶点的位置?因为我不确定这是否能达到你想要的效果。
  • 是的,这就是目标。根据我所看到的,它似乎做得正确。在没有应用位移的情况下使用它会导致球体被绘制而没有任何问题。也感谢你的链接,我记下了。
  • (vec4(vec3(displacment,displacment,0) * normalize(Normal_FS_in),1)) 在我看来也很奇怪...我很可能是错的,但不应该是normalize(Normal_FS_in) * displacement,因为您似乎正在世界空间中进行置换?此外,如果您在正常空间中进行位移,则应在添加位置和位移向量后乘以投影矩阵。

标签: c++ opengl glsl glfw opengl-4


【解决方案1】:

这可能是很多事情。这里有些例子: 1)你在着色器中搞砸了一些东西(忘记了逆或变换) 2)您错误地连接了控件(鼠标向左做了一些奇怪的事情)。 3)控制模型搞砸了(你移动目标而不是相机)。 4) 别的东西。 5) 以上部分/全部。

尝试调试一下。如果完全禁用着色器,看起来还可以吗?只需画一个简单的立方体(可能比球体更容易跟踪)。

如果没问题,那就加shader但是不要在里面做任何事情,看看shader中的transform是否合理(还是立方体)。

这应该有助于缩小可能的原因。

【讨论】:

    【解决方案2】:

    问题是这样的:

    gl_Position = MVP*(p0*p.x + (p1*p.y) + p2*p.z) + (vec4(vec3(displacment,displacment,0) * normalize(Normal_FS_in),1));

    您投射一些位置,然后添加屏幕空间位移。如果没有看到整个着色器,很难说到底出了什么问题。但是你可能漏掉了一些括号。

    此外,您正在混合没有透视分割的投影矢量。

    MVP*(p0*p.x + (p1*p.y) + p2*p.z)

    这个向量的w部分不是1,所以你的位移将根据相机位置进行缩放

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      相关资源
      最近更新 更多