1

下面是我的结果的图片。

我正在使用平面阴影并将每个顶点放在它们可敬的三角形对象中。然后我使用这些顶点来计算表面法线。我一直在阅读,因为我的三角形共享相似的顶点,计算法线可能是一个问题?但对我来说,这看起来像是一个绕组问题,因为其他所有的都是关闭的。

我在下面提供了一些我的代码给任何想要查看它并更好地了解问题可能是什么的人。

一个三角形带

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();
4

2 回答 2

1

其实两者合二为一。法线的方向取决于用于计算它的绕组。但最终归结为法线问题,因为这决定了光照计算。

Winding 对于 OpenGL 来说也很重要,但是在条带图元中你不能改变任何东西。

于 2013-12-04T21:25:14.880 回答
1

您应该在调用之前glVertex3f (...)设置正常。调用glVertex*基本上是最终确定一个顶点,它将当前颜色、法线、纹理坐标等与您传递的位置的顶点相关联并发出一个新顶点。


glVertex — 指定一个顶点

描述

glVertex命令在glBegin / glEnd对中用于指定点、线和多边形顶点。调用glVertex时,当前颜色、法线、纹理坐标和雾坐标与顶点相关联。

当仅指定 x 和 y 时, z 默认为0.0, w 默认为1.0。当指定 x、y 和 z 时,w 默认为1.0


很有可能是您问题的很大一部分。三角形条旨在解决隐含的缠绕问题。当您使用条带时,您必须反转每个三角形的缠绕,但光栅化器通过在每个备用三角形内部翻转用于前/后的缠绕顺序来补偿这一点。

更新:

当然要理解,光栅化器足够聪明,可以在使用条带时翻转每个备用三角形的前/后绕组,但您的代码不是(至少目前不是)。当您在 CPU 端自己计算法线时,您需要补偿交替反转的绕组。

于 2013-12-04T21:57:53.010 回答