如何在OpenGL中实现无重复顶点的平面着色? [英] How to implement flat shading in OpenGL without duplicate vertices?
本文介绍了如何在OpenGL中实现无重复顶点的平面着色?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用平面着色在LWJGL OpenGL中渲染3D棱镜。例如,我有一个多维数据集索引,如下所示:
我在顶点缓冲区中只有8个顶点,我如上所述对它们进行了索引。有没有办法在立方体上实现平坦的法线着色,如下图所示?如果可能,我不想重写顶点和索引缓冲区以包括重复的顶点。
推荐答案
如果不需要任何其他属性(例如纹理坐标),则可以选择仅通过8个顶点创建具有面法向矢量的立方体网格。对法线矢量使用flat
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中实现无重复顶点的平面着色?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文