【问题标题】:can i calculate normals in gpu?我可以在gpu中计算法线吗?
【发布时间】:2011-03-21 19:04:26
【问题描述】:

我有一个加载 dxf 并将其绘制在屏幕上的 opengl 应用程序, 每次我需要计算法线。有没有办法在 GPU 而不是 CPU 中计算法线?如果有怎么办?

【问题讨论】:

    标签: c++ opengl gpu


    【解决方案1】:

    你必须使用着色器。

    您可以使用 GLSL 几何着色器。这是面部法线的 GLSL 版本。顶点法线需要更多的工作,因为它们必须考虑相邻顶点。

    • 确保您的显卡支持几何着色器!例如使用 GPU Caps Viewer。
    • 剪切和粘贴任何教程以在您的应用中加入几何着色器。
    • 着色器应如下所示:
    //glsl shader
    
    #version 120
    #extension GL_EXT_geometry_shader4 : enable
    void main(void)
    {
    // Compute per-face normal
        vec4 d1 = gl_PositionIn[1] - gl_PositionIn[0];
        vec4 d2 = gl_PositionIn[2] - gl_PositionIn[0];
        gl_Normal = cross(d1,d2);
    
    // Emit all input vertices
        for(i=0; i< gl_VerticesIn; i++){
            gl_Position = gl_PositionIn[i];
            EmitVertex();
        }
        EndPrimitive();
    }   
    

    【讨论】:

      【解决方案2】:

      是的,这是可能的。你会想在Cg 中了解着色器。

      Official book.

      【讨论】:

      • 法线应该在几何着色器中计算,而不是片段。
      【解决方案3】:

      您可以从几何着色器中计算“平面着色”(每个面一个法线)法线。每个三角形一个,“即时”,使用叉积。您无法以这种方式生成“平滑”法线,因为 GS 没有关于邻居的信息。

      如果网格是参数化的(例如元球),则可以通过对附近的几个函数值进行采样来计算法线。这也可以在 GPU 上完成。

      如果网格基于高度图或类似的东西,您还可以在着色器中计算法线。

      如果 GPU 支持 CUDA、OpenCL 或类似的东西,并且如果它可以处理任意数据数组,那么您可能还可以使用传统技术在 GPU 上计算法线。

      另外,我认为 5 年前(大约)我看到了一篇题为“GPU 上的正常平滑”或“GPU 上的正常生成”之类的论文。第一页上有一个平面阴影反射多边形心。不幸的是,我找不到那篇论文,我也不确定它是否存在(或者我在哪里看到的)。您可以在 GDC 论文、SIGGRAPH 论文、ATI SDK 或 NVidia SDK 中找到它(如果存在)。

      【讨论】:

        【解决方案4】:

        看看glEnable(GL_AUTO_NORMAL)

        【讨论】:

          猜你喜欢
          • 2012-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-10
          • 1970-01-01
          • 1970-01-01
          • 2020-01-14
          • 1970-01-01
          相关资源
          最近更新 更多