下面是我的结果的图片。
我使用平面着色并将每个顶点放在他们可敬的三角形对象中。然后我使用这些顶点来计算表面法线。我一直在阅读,因为我的三角形有相似的顶点,计算法线可能是一个问题?但对我来说,这似乎是一个蜿蜒的问题,因为每一个都是关闭的。
我将以下代码提供给任何想要查看它的人,并更好地了解问题所在。
Triangle currentTri = new Triangle();
int triPointIndex = 0;
List<Triangle> triList = new ArrayList<Triangle>()
GL11.glBegin(GL11.GL_TRIANGLE_STRIP);
int counter1 = 0;
float stripZ = 1.0f;
float randY;
for (float x=0.0f; x<20.0f; x+=2.0f) {
if (stripZ == 1.0f) {
stripZ = -1.0f;
} else { stripZ = 1.0f; }
randY = (Float) randYList.get(counter1);
counter1 += 1;
GL11.glVertex3f(x, randY, stripZ);
Vert currentVert = currentTri.triVerts[triPointIndex];
currentVert.x = x;
currentVert.y = randY;
currentVert.z = stripZ;
triPointIndex++;
System.out.println(triList);
Vector3f normal = new Vector3f();
float Ux = currentTri.triVerts[1].x - currentTri.triVerts[0].x;
float Uy = currentTri.triVerts[1].y - currentTri.triVerts[0].y;
float Uz = currentTri.triVerts[1].z - currentTri.triVerts[0].z;
float Vx = currentTri.triVerts[2].x - currentTri.triVerts[0].x;
float Vy = currentTri.triVerts[2].y - currentTri.triVerts[0].y;
float Vz = currentTri.triVerts[2].z - currentTri.triVerts[0].z;
normal.x = (Uy * Vz) - (Uz * Vy);
normal.y = (Uz * Vx) - (Ux * Vz);
normal.z = (Ux * Vy) - (Uy * Vx);
GL11.glNormal3f(normal.x, normal.y, normal.z);
if (triPointIndex == 3) {
triList.add(currentTri);
Triangle nextTri = new Triangle();
nextTri.triVerts[0] = currentTri.triVerts[1];
nextTri.triVerts[1] = currentTri.triVerts[2];
currentTri = nextTri;
triPointIndex = 2;
}
}
GL11.glEnd();
答案 0 :(得分:1)
实际上它是一体的。法线的方向取决于用于计算它的绕组。然而,最终它归结为法线问题,因为这是决定照明计算的原因。
Winding对OpenGL也很重要,但你不能在条纹原语中改变它。
答案 1 :(得分:1)
您应该在 调用glVertex3f (...)
之前设置正常的 。对glVertex*
的调用基本上是最终确定顶点,它将当前颜色,法线,纹理坐标等与您传递的位置处的顶点相关联并发出新的顶点。
<小时/>
描述
在 glBegin / glEnd 对中使用glVertex 命令来指定点,线和多边形顶点。当调用 glVertex 时,当前颜色,法线,纹理坐标和雾坐标与顶点相关联。
当仅指定x和y时,z默认为 0.0 ,w默认为 1.0 。指定x,y和z时,w默认为 1.0 。
很有可能这个是您问题的重要组成部分。三角形条带旨在解决隐式缠绕问题。当你使用条带时,你必须反转每个三角形的缠绕,但是光栅化器通过在每个交替的三角形上翻转用于前/后的缠绕顺序来补偿这一点。
当然理解光栅化器足够聪明,可以在使用条带时翻转每个交替三角形的前/后绕组,但您的代码不是(至少目前不是)。当你自己在CPU端计算法线时,需要补偿交替反向的绕组。