我有一个网格,它的顶点位置是由顶点着色器动态生成的。我一直在使用https://www.khronos.org/opengl/wiki/Calculating_a_Surface_Normal来计算几何着色器中每个图元的表面法线,这似乎工作得很好。
不幸的是,我正计划切换到一个无法使用几何着色器的环境。我正在寻找其他方法来计算曲面法线。我考虑了:
- 在两个通道中使用计算着色器。一个通道生成顶点位置,另一个通道(使用生成的顶点位置)计算表面法线,然后将数据传递到着色器管道。
- 使用ARB_shader_image_load_store(或相关的)将顶点位置写入纹理(在顶点着色器中),然后可以从片段着色器中读取。片段着色器应该能够安全地访问顶点位置(因为它只访问用于调用片段的顶点),然后可以计算每个片段的表面法线。
我 * 相信 * 这两种方法都可以工作,但我想知道是否有一种简单的方法来完成这一任务,特别是考虑到这似乎是一个相当常见的任务。我也想知道我提出的任何一个想法是否有任何问题,因为我对计算着色器和image_load_store都没有什么经验。
1条答案
按热度按时间55ooxyrt1#
请参见Diffuse light with OpenGL GLSL。如果您只需要面法线,可以使用partial derivative
dFdx
,dFdy
.基本片段着色器,该着色器在与position
相同的空间中计算法线向量(N
):