Opengl TRIANGLE_STRIPS 创建重复的幽灵

Posted

技术标签:

【中文标题】Opengl TRIANGLE_STRIPS 创建重复的幽灵【英文标题】:Opengl TRIANGLE_STRIPS creating duplicate ghost 【发布时间】:2012-08-02 14:52:34 【问题描述】:

我在制作我的第一个着色器时获得了一些乐趣,我的第一个测试对象是一张 100x100 的四面体图片。 我想我会学习如何使用TRIANGLE_STRIP,所以我切换了它,移动了一个顶点调用,让它看起来又是方形的。打开我的着色器,它后面只有一张脸的副本,但它上面有整个纹理。对于这个形状,我只有一组绘制调用....

这是我的形状代码:

glBegin(GL_TRIANGLE_STRIP);
    float vx;
    float vy;
    for(float x=0; x<100; x++)
        for(float y=0; y<100; y++)
            float vx=x/5.0;
            float vy=y/5.0;
            glTexCoord2f(0.01*x, 0.01*y);
            glVertex3f(vx, vy, 0);

            glTexCoord2f(0.01+0.01*x, 0.01*y);
            glVertex3f(.2+vx, vy, 0);

            glTexCoord2f(0.01*x, 0.01+0.01*y);
            glVertex3f(vx, .2+vy, 0);

            glTexCoord2f(0.01+0.01*x, 0.01+0.01*y);
            glVertex3f(.2+vx, .2+vy, 0);
    
glEnd();

还有我的(顶点)着色器代码:

uniform float uTime,uWaveintensity,uWavespeed;
uniform float uZwave1,uZwave2,uXwave,uYwave;
void main()
vec4 position = gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
position.z=((sin(position.x+uTime*uWavespeed)*uZwave1)+(sin(position.y+uTime*uWavespeed))*uZwave2)*uWaveintensity;
position.x=position.x+(sin(position.x+uTime*uWavespeed)*uXwave)*uWaveintensity;
position.y=position.y+(sin(position.y+uTime*uWavespeed)*uYwave)*uWaveintensity;
gl_Position = gl_ModelViewProjectionMatrix * position;

如果有人有任何关于使用共享顶点(triangle_strips)更有效地绘制的信息,我已经用谷歌搜索了,但到目前为止我还没有理解 XD。我想知道。

屏幕截图: 8x8 面

同一个角度,线条=鬼

我知道现在发生了什么,但我不知道如何解决它。

【问题讨论】:

有这样的问题 - 它总是有助于发布截图。最好还使用 glPolygonMode(GL_FRONT, GL_LINE) 发布屏幕截图,以便我们可以看到您的顶点发生了什么。 对不起,我不知道你可以发布截图。或者你的意思是链接......我看到了nvm jo @Kaliber64 你还在吗? 您需要什么吗? 【参考方案1】:

我认为您无法通过这种方式创建一个 100x100 的四边形平面。现在你只是在一个方向上按行和列,这意味着第一行的最后 2 个顶点将与第二行的第一个顶点创建一个三角形,这不是你想要的。

我建议您从 2x2 模式开始,以了解三角形条带的工作原理,然后转向 3x3 和 4x4 以了解奇数和偶数情况之间的区别。当您对问题有所了解后,您可以创建通用算法并将大小更改为 100。

在此之后,您可以专注于顶点着色器以使其挥动。

对于未来:如果您要了解大数据的工作原理,就不要从大数据开始。 :)

编辑:

自从我写了这个答案后,我了解到你已经可以用一个三条线制作两个维度网格,使用退化三角形:)。

当一个三角形两次使用相同的顶点时,光栅化器会在渲染过程中忽略它,因此在第一个条带结束时,您可以使用第一个条带的最后一个顶点和第二个条带的第一个顶点创建一个退化三角形。将两个顶点中的哪一个用作第三个顶点并不重要,只要它们的顺序正确(例如 1,1,2 或 1,2,2)。这样您就创建了一个不会被绘制的三角形,但它会将下一个“起始”点移动到第二条带的开头,您可以在此处继续构建网格。

缺点是您创建了一些三角形,它们将被转换但不会被绘制(它们不会很多),但优点是您只需向 GPU 运行一个“绘制条带”命令,速度要快得多。

【讨论】:

真人的所有面孔都存在。除非它是波浪状的,否则你看不到幽灵!然而,鬼是缺少角落,2我想。我看不出真品有任何缺陷。获取屏幕截图。

以上是关于Opengl TRIANGLE_STRIPS 创建重复的幽灵的主要内容,如果未能解决你的问题,请参考以下文章

为现代 opengl 创建立体环境

OpenGL入门之认识OpenGL和创建Window

创建OpenGL Context(WGL)

创建 OpenGL 阴影

OpenGL教程——准备

SDL + OpenGL:创建缓冲区时访问冲突