Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在OpenGL中实现无重复顶点的平面着色?_Opengl_Glsl_Shader_Lwjgl_N Dimensional - Fatal编程技术网

如何在OpenGL中实现无重复顶点的平面着色?

如何在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

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

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


如果不需要任何其他属性(例如纹理坐标),则可以选择仅通过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个以上的三角形共享同一个顶点,你需要一些更奇特的东西。还是我完全错了?