ufk*_*ufk 5 c++ opengl gpu-programming
我有一个opengl应用程序加载一个dxf并在屏幕上绘制,每次我需要计算法线.有没有办法计算GPU中的法线而不是CPU?如果是这样的话?
您可以从几何着色器中计算“平面着色”(每个面一个法线)法线。每个三角形一个,“动态”,使用叉积。您无法以这种方式生成“平滑”法线,因为 GS 没有有关邻居的信息。
如果网格是参数化的(例如元球),则可以通过采样几个附近的函数值来计算法线。这也可以在 GPU 上完成。
如果网格基于高度图或类似的东西,您还可以在着色器中计算法线。
如果 GPU 支持 CUDA、OpenCL 或类似的东西,并且如果它可以处理任意数据数组,那么您也可以使用传统技术在 GPU 上计算法线。
另外,我认为 5 年前(大约)我看到了一篇名为“GPU 上的正常平滑”或“GPU 上的正常生成”之类的论文。它的第一页上有一个平底阴影的反光多边形心形。不幸的是,我找不到那篇论文,而且我不确定它是否存在(或者我在哪里看到它)。您也许可以在 GDC 论文、SIGGRAPH 论文、ATI SDK 或 NVidia SDK 中找到它(如果存在)。
您将不得不使用着色器。
您可以使用 GLSL 几何着色器。这是面部法线的 GLSL 版本。顶点法线需要更多的工作,因为它们必须考虑相邻的顶点。
//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();
}
Run Code Online (Sandbox Code Playgroud)