如何在OpenGL中实现无重复顶点的平面着色? [英] How to implement flat shading in OpenGL without duplicate vertices?

查看:33
本文介绍了如何在OpenGL中实现无重复顶点的平面着色?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

推荐答案

如果不需要任何其他属性(例如纹理坐标),则可以选择仅通过8个顶点创建具有面法向矢量的立方体网格。对法线矢量使用flatInterpolation 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆