opengl 计算动态网格的曲面法线(不使用几何体着色器)

af7jpaap  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(144)

我有一个网格,它的顶点位置是由顶点着色器动态生成的。我一直在使用https://www.khronos.org/opengl/wiki/Calculating_a_Surface_Normal来计算几何着色器中每个图元的表面法线,这似乎工作得很好。
不幸的是,我正计划切换到一个无法使用几何着色器的环境。我正在寻找其他方法来计算曲面法线。我考虑了:

  • 在两个通道中使用计算着色器。一个通道生成顶点位置,另一个通道(使用生成的顶点位置)计算表面法线,然后将数据传递到着色器管道。
  • 使用ARB_shader_image_load_store(或相关的)将顶点位置写入纹理(在顶点着色器中),然后可以从片段着色器中读取。片段着色器应该能够安全地访问顶点位置(因为它只访问用于调用片段的顶点),然后可以计算每个片段的表面法线。

我 * 相信 * 这两种方法都可以工作,但我想知道是否有一种简单的方法来完成这一任务,特别是考虑到这似乎是一个相当常见的任务。我也想知道我提出的任何一个想法是否有任何问题,因为我对计算着色器和image_load_store都没有什么经验。

55ooxyrt

55ooxyrt1#

请参见Diffuse light with OpenGL GLSL。如果您只需要面法线,可以使用partial derivative dFdx , dFdy .基本片段着色器,该着色器在与position相同的空间中计算法线向量(N):

in vec3 position; 

void main()
{
    vec3 dx = dFdx(position);
    vec3 dy = dFdy(position);
    vec3 N = normalize(cross(dx, dy));

    // [...]
}

相关问题