【问题标题】:Appearance of a triangle strip. Surface normals? Or windings?外观呈三角条状。表面法线?还是绕组?
【发布时间】:2013-12-04 21:13:31
【问题描述】:

下面是我的结果的图片。

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

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

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

【问题讨论】:

    标签: java opengl lwjgl normals gl-triangle-strip


    【解决方案1】:

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


    glVertex — specify a vertex

    说明

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

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


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

    更新:

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

    【讨论】:

    • OPs 问题可能是由于他的正常计算被每个奇数索引三角形“交换”造成的。您可以在他的照片中看到暗淡的三角形,因此这不是缠绕/剔除问题(正如您所指出的那样,不能在条带中)。
    • @datenwolf:啊,我重新阅读了问题并再次查看了图表。是的,“丢失”(笔记本电脑液晶显示器让我第一次看到这个问题时很难看到)暗三角形肯定是因为在反转缠绕顺序后在 CPU 端计算法线。光栅化器按描述完成其工作,但计算法线的实际 Java 代码的行为与描述不同;它还需要为每个备用三角形翻转它们。但除此之外,法线被分配给每个顶点的时间较晚,所以它们总是一个接一个。
    • 谢谢!这真的帮助我弄清楚发生了什么并清除了很多事情。我最终让它工作了。 :)
    【解决方案2】:

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

    绕线对于 OpenGL 也很重要,但您无法在条带图元中对其进行任何更改。

    【讨论】:

    • 所以你是说没有办法解决这个问题,我应该从使用 GL_TRIANGLE_STRIP 切换到使用 GL_TRIANGLES?
    • 或者我可以对我的表面法线计算做一些不同的事情,以便补偿和反转所有其他三角形吗?
    • @AlphaCentauriAB:你应该修正你的法线计算。对于每个奇数索引三角形,您要么必须将向量交换为叉积,要么将结果法线缩放 -1。此外,您必须在调用 glVertex 之前调用 glNormal。
    • 谢谢!此评论中的第二句话确实帮助我最大地解决了这个问题。不过这比我容易多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多