Sib*_*ibh 10 opengl shader glsl lwjgl n-dimensional
我正在尝试使用平面着色在 LWJGL OpenGL 中渲染 3D 棱镜。例如,我有一个索引如下的多维数据集:
我的顶点缓冲区中只有 8 个顶点,我已按上述方式对其进行了索引。有没有办法在立方体上实现平坦的法线着色,如下所示?如果可能的话,我不想重写我的顶点和索引缓冲区以包含重复的顶点。
Rab*_*d76 11
如果您不需要任何其他属性(例如纹理坐标),则可以选择创建带有面法向量(仅由 8 个顶点)的立方体网格。使用flat Interpolation qualifier代表法向量。
顶点着色器:
flat out vec3 surfaceNormal;
Run Code Online (Sandbox Code Playgroud)
碎片萨德:
flat out vec3 surfaceNormal;
Run Code Online (Sandbox Code Playgroud)
当flat使用限定符时,顶点着色器的输出将不会被插值。赋予片段着色器的值是与图元的一个顶点(Provoking vertex)关联的属性之一。
对于GL_TRINANGLE基元来说,这是最后一个或第一个顶点。可以通过 来选择glProvokingVertex。
选择第一个顶点:
glProvokingVertex(GL_FIRST_VERTEX_CONVENTION);
Run Code Online (Sandbox Code Playgroud)
对于立方体网格点的顺序(问题中的图像)
glProvokingVertex(GL_FIRST_VERTEX_CONVENTION);
Run Code Online (Sandbox Code Playgroud)
您必须设置以下顶点坐标和法向量:
front back
1 3 7 5
+---+ +---+
| | | |
+---+ +---+
0 2 6 4
Run Code Online (Sandbox Code Playgroud)
以这种方式定义索引,即顶点 7, 3, 0, 4, 6, 1 是立方体的左、右、前、后、底部和顶部两个三角形的第一个顶点:
// 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
Run Code Online (Sandbox Code Playgroud)
绘制 12 个三角形基元。例如:
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
Run Code Online (Sandbox Code Playgroud)