如何在OpenGL中实现无重复顶点的平面着色?
我正在尝试在LWJGL OpenGL中使用平面着色渲染3D棱镜。例如,我有一个多维数据集,索引如下: 我在顶点缓冲区中只有8个顶点,我如上所述对其进行了索引。有没有办法在立方体上实现平面法线着色,如下图所示?如果可能的话,我不想重写顶点和索引缓冲区以包含重复的顶点如何在OpenGL中实现无重复顶点的平面着色?,opengl,glsl,shader,lwjgl,n-dimensional,Opengl,Glsl,Shader,Lwjgl,N Dimensional,我正在尝试在LWJGL OpenGL中使用平面着色渲染3D棱镜。例如,我有一个多维数据集,索引如下: 我在顶点缓冲区中只有8个顶点,我如上所述对其进行了索引。有没有办法在立方体上实现平面法线着色,如下图所示?如果可能的话,我不想重写顶点和索引缓冲区以包含重复的顶点 如果不需要任何其他属性(例如纹理坐标),则可以选择仅通过8个顶点创建具有面法线向量的立方体网格。使用法向量的平面 顶点着色器: flat out vec3 surfaceNormal; 片段sahder: flat out vec
如果不需要任何其他属性(例如纹理坐标),则可以选择仅通过8个顶点创建具有面法线向量的立方体网格。使用法向量的
平面
顶点着色器:
flat out vec3 surfaceNormal;
片段sahder:
flat out vec3 surfaceNormal;
使用flat
限定符时,将不会插值顶点着色器的输出。给定给片段着色器的值是与基本体的一个顶点关联的属性之一。对于顶点,这是最后一个顶点或第一个顶点。这可以由您选择 选择第一个顶点:
glProvokingVertex(GL_FIRST_VERTEX_CONVENTION);
有关立方体网格点的顺序(问题中的图像)
前后
1 3 7 5
+---+ +---+
| | | |
+---+ +---+
0 2 6 4
必须设置以下顶点坐标和法向量:
//x y z nx,ny,nz
-1,-1,-1,0,-1,0,//0,nv前
-1,-1,1,0,0,1,//1,nv顶部
1, -1, -1, 0, 0, 0, // 2
1,-1,1,1,0,0,//3,nv右
1,1,-1,0,1,0,//4,nv返回
1, 1, 1, 0, 0, 0, // 5
-1,1,-1,0,0,-1,//6,nv底部
-1,1,1,-1,0,0,//7,nv左
以这种方式定义索引,即顶点7、3、0、4、6、1是立方体左、右、前、后、底部和顶部两个三角形的第一个顶点:
0,2,3,0,3,1、//前面
4,6,7,4,7,5,//返回
3,2,4,3,4,5,//对
7,6,0,7,0,1,//左
6,4,2,6,2,0,//底部
1,3,5,1,5,7//顶部
绘制12个三角形基本体。e、 g:
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
当你说“平面阴影”时,你到底是什么意思?你的意思是你想计算一个面法线,它在三角形的表面上是恒定的,还是你真的想计算VS中的照明?或者别的什么。“如果可能的话,我不想重写顶点和索引缓冲区以包含重复的顶点。”为什么不呢?我已经为一个广义的N维3D棱柱体实现了顶点和索引,所以我不想回去重写所有这些。当我说平面明暗处理时,我的意思是创建类似上图中立方体的东西。我已经可以计算每个三角形的面法线,但我不知道如何在法线数组中设置它们的格式。因此,您知道如何编写漫反射着色着色器,这是您的问题,如何将数据发送到GPU,以便法线对应于直角三角形,当你没有IBO?@rabbi76时,恐怕你在这种情况下有点错,因为对于n维对象,数学不是在着色器中自然实现的,如果发生任何类型的3D投影,你将无法再从投影面计算法线,而不会丢失信息。。。如果将整个ND网格传递给着色器,则可能会发生这种情况,但很可能不会以GLSL本机方式传递,因此几何体着色器也将毫无用处。@Sibh看看这些:并了解一些想法。但是,正如我在前面的评论中提到的,如果你想要正确的平面着色,你需要计算并传递ND法线,而不是3D法线,并将照明点积调整为ND!!!示例仅使用简单的3D法线,因此它们缺少3D上的尺寸。。。这与在平面上投影3D对象并使用单色对其进行整体着色一样,这样您就看不到边了……诚实的问题是,每个顶点是否还需要3条不同的法线?每张脸一张?这里的问题不在于插值,而在于单个顶点需要根据当前渲染的不同法线face@Makogan不,如果法向量垂直于面(立方体的边),那么每个三角形只需要1个。如果一个边的两个三角形共享第一个顶点,则两个三角形的一个法向量就足够了。每个激发顶点需要1个法向量。激发顶点由索引定义:0、4、3、7、6、1如何告诉GPU读取哪个法线?我习惯于每个顶点都有一个法线和uv的模式,因此我想我有点困惑,当它们不匹配时如何渲染。@Makogan“如何告诉GPU[…]”-关键字
flat
和glProvokingVertex(GL_第一顶点_约定)
。这意味着使用与三角形第一个顶点相关联的法向量,忽略第二个和第三个顶点。注意,有8个顶点和8个法向量。这是一个指数和绘制三角形顺序的问题。没有紫外线坐标。你不能在纹理坐标中使用这个解决方案,因为对纹理进行着色是没有意义的。啊,我明白了,你排列了面的索引,这样3个潜在三角形中的每一个都有不同的法线。所以如果我理解正确的话,如果你有一个三角形扇子,有3个以上的三角形共享同一个顶点,你需要一些更奇特的东西。还是我完全错了?