2

我在制作我的第一个着色器时获得了一些乐趣,我的第一个测试对象是一张 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 面

在此处输入图像描述

相同的东西相同的角度,线条=鬼

在此处输入图像描述

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

4

1 回答 1

4

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

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

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

对于未来:如果你正在学习大数据是如何运作的,那就永远不要从大数据开始。:)

编辑:

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

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

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

于 2012-08-02T15:13:00.470 回答