opengl - 如何在OpenGL中实现没有重复顶点的平面着色?

标签 opengl glsl shader lwjgl n-dimensional

我正在尝试使用平面着色在 LWJGL OpenGL 中渲染 3D 棱镜。例如,我有一个索引如下的多维数据集:

enter image description here

我的顶点缓冲区中只有 8 个顶点,我已按上述方式对其进行了索引。有没有办法在立方体上实现平坦的法线着色,如下所示?如果可能的话,我不想重写我的顶点和索引缓冲区以包含重复的顶点。

最佳答案

如果您不需要任何其他属性(例如纹理坐标),则可以选择创建带有面法向量(仅由 8 个顶点)的立方体网格。使用平面 Interpolation qualifier为法向量。

顶点着色器:

flat out vec3 surfaceNormal;

碎片萨德尔:

flat out vec3 surfaceNormal;

当使用flat限定符时,顶点着色器的输出将不会被插值。赋予片段着色器的值是与图元的一个顶点关联的属性之一,Provoking vertex .
对于GL_TRINANGLE primitive这是最后一个或第一个顶点。可以通过 glProvokingVertex 选择.

选择第一个顶点:

glProvokingVertex(GL_FIRST_VERTEX_CONVENTION);

对于立方体网格点的顺序(问题中的图像)

  front      back

  1     3    7     5
   +---+      +---+
   |   |      |   |
   +---+      +---+
  0     2    6     4

您必须设置以下顶点坐标和法向量:

//  x   y   z   nx, ny, nz
    -1, -1, -1,   0, -1,  0,  // 0, nv front
    -1, -1,  1,   0,  0,  1,  // 1, nv top
     1, -1, -1,   0,  0,  0,  // 2
     1, -1,  1,   1,  0,  0,  // 3, nv right
     1,  1, -1,   0,  1,  0,  // 4, nv back
     1,  1,  1,   0,  0,  0,  // 5
    -1,  1, -1,   0,  0, -1,  // 6, nv bottom
    -1,  1,  1,  -1,  0,  0,  // 7, nv left 

以这种方式定义索引,顶点 7, 3, 0, 4, 6, 1 是立方体的左、右、前、后、下、上两个三角形的第一个顶点:

0, 2, 3,   0, 3, 1, // front
4, 6, 7,   4, 7, 5, // back
3, 2, 4,   3, 4, 5, // right
7, 6, 0,   7, 0, 1, // left
6, 4, 2,   6, 2, 0, // bottom 
1, 3, 5,   1, 5, 7  // top

绘制 12 个三角形基元。例如:

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);

关于opengl - 如何在OpenGL中实现没有重复顶点的平面着色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60022613/

相关文章:

c++ - 带有 Win32 HWND 嵌入的 Qt5 QWidget::create() 在从 Qt4 移植后不再工作

python - 如何将 C++ 或 GLM 结构表示为 numpy 数组?

c++ - 在 OpenGL 中渲染透明 block

c++ - 如何创建模糊着色器

c++ - 如何从 .fxo 文件创建 ID3D11VertexShader?

c++ - 具有常量法线的 glDrawElements

opengl - 使 glReadPixel() 运行得更快

glsl - 向量分量中 s,t,p,q 的含义是什么?

javascript - 具有反射问题的片段着色器三.js

c - 获取总视频内存大小