我可以在gpu中计算法线吗?

时间:2010-07-27 19:12:42

标签: c++ opengl gpu-programming

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

4 个答案:

答案 0 :(得分:4)

您可以在几何着色器中计算“平面阴影”(每个法线一个法线)法线。每个三角形一个,“在运行中”,使用交叉产品。你无法以这种方式生成“平滑”法线,因为GS没有关于邻居的信息。

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

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

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

另外,我认为5年前(左右)我看到一篇名为“GPU上的正常平滑”或“GPU上的正常生成”的文章。它在第一页上有一个平面阴影的反射多边形心脏。不幸的是,我找不到那张纸,我不确定它是否存在(或者我看到它)。您可以在GDC论文,SIGGRAPH论文,ATI SDK或NVidia SDK中找到它(如果存在)。

答案 1 :(得分:4)

您必须使用着色器。

您可以使用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 :(得分:2)

是的,这是可能的。您需要了解Cg中的着色器。

Official book

答案 3 :(得分:1)

查看glEnable(GL_AUTO_NORMAL)