opengl - 如何在立方体上获得平坦的法线

标签 opengl glsl opengl-3

我使用的 OpenGL 没有弃用的功能,我的光计算是在片段着色器上完成的。所以,我正在做平滑着色。

我的问题是,当我绘制立方体时,我需要平面法线。我所说的平面法线是指在一张脸上生成的每个片段都具有相同的法线。

到目前为止,我对此的解决方案是为每个面生成不同的顶点。所以,现在我有 24(6*4) 个顶点,而不是 8 个顶点。

但这对我来说似乎是错误的,复制顶点。有没有更好的方法来获得平坦的法线?

更新:我使用的是 OpenGL 3.3.0 版,尚不支持 OpenGL 4。

最佳答案

如果在相机空间中进行照明,则可以使用 dFdx/dFdy 从顶点的相机空间位置计算面部的法线。

所以片段着色器看起来有点像这样。

varying vec3 v_PositionCS; // Position of the vertex in camera/eye-space (passed in from the vertex shader)

    void main()
    { 
      // Calculate the face normal in camera space
      vec3 normalCs = normalize(cross(dFdx(v_PositionCS), dFdy(v_PositionCS)));

      // Perform lighting 
      ...
      ...
    }

关于opengl - 如何在立方体上获得平坦的法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14980712/

相关文章:

opengl - 对渲染的 FBO 的纹理查找偏差了半个像素

c++ - 如何使用多个统一缓冲区对象

c++ - OpenGL:在帧中回收帧缓冲区会影响性能吗?

c++ - 线条不会出现在 opengl 中

c++ - 创建 GL_TEXTURE_2D_ARRAY 后访问冲突

c++ - OpenGL 渲染错误

opengl - GLSL片段着色器——绘制简单的粗曲线

c - 通过渲染四边形更新粒子系统的速度和位置

c++ - OpenGL 属性偏移量未按预期工作

c++ - 在 OpenGL 中使用纹理图集作为纹理数组