1

我正在尝试使用 GLSL 进行编程,但我对我应该做什么有点困惑。我已经弄清楚如何将一个顶点数组、一个纹理坐标数组(每个顶点)、一个元素数组和两个纹理传递给一个简单的 GLSL 程序。我在学习时使用 pygame 是为了简单。

我像这样创建顶点、纹理坐标和元素数组:

w = 16
h = 12

vertex_array = []
tex_coord_array = []
element_array = []

for i in range(h):
    for j in range(w):
        vertex_array += [-1.0+j*2.0/(w-1), 1.0-i*2.0/(h-1), 0.0, 1.0]

        if j%2:
            tex_coord_array += [1.0]
        else:
            tex_coord_array += [0.0]

        if i%2:
            tex_coord_array += [0.0]
        else:
            tex_coord_array += [1.0]

for i in range(1,h):
    for j in range(1,w):
        element_array += [(i-1)*w+(j-1), i*w+(j-1), (i-1)*w+j]
        element_array += [i*w+(j-1), i*w+j, (i-1)*w+j]

...使用以下着色器给我一个简单的纹理三角形“墙”:

vertex_shader = '''\
#version 110

attribute vec2 tex_coord;
attribute vec4 position;

varying vec2 texcoord;

void main()
{
    gl_Position = position;
    texcoord = tex_coord;
}
'''

fragment_shader = '''\
#version 110

uniform sampler2D textures[2];

varying vec2 texcoord;

void main()
{
    gl_FragColor = texture2D(textures[0], texcoord);
}
'''

现在我得到了每个方向的纹理镜像(每 4 个四边形),因为我只为每个顶点提供一个纹理坐标,而不是为元素数组的每个元素传递一个。我想用正确对齐的纹理对所有四边形进行纹理处理(因为我告诉自己这是 GLSL 的一个良好开端 ^^),这样做的方法是什么?

谢谢!

更新:

正如 Nicol Bolas 指出的那样——这并不是真正的 GLSL 问题。现在我刚刚重做了顶点/坐标/元素的生成:

for i in range(h):
    for j in range(w):
        # first triangle
        vertex_array += [-1.0+j*2.0/(w-1), 1.0-i*2.0/(h-1), 0.0, 1.0]
        tex_coord_array += [0.0, 1.0]
        vertex_array += [-1.0+j*2.0/(w-1), 1.0-(i+1)*2.0/(h-1), 0.0, 1.0]
        tex_coord_array += [0.0, 0.0]
        vertex_array += [-1.0+(j+1)*2.0/(w-1), 1.0-i*2.0/(h-1), 0.0, 1.0]
        tex_coord_array += [1.0, 1.0]
        # second triangle
        vertex_array += [-1.0+j*2.0/(w-1), 1.0-(i+1)*2.0/(h-1), 0.0, 1.0]
        tex_coord_array += [0.0, 0.0]
        vertex_array += [-1.0+(j+1)*2.0/(w-1), 1.0-(i+1)*2.0/(h-1), 0.0, 1.0]
        tex_coord_array += [1.0, 0.0]
        vertex_array += [-1.0+(j+1)*2.0/(w-1), 1.0-i*2.0/(h-1), 0.0, 1.0]
        tex_coord_array += [1.0, 1.0]

element_array = range(h*w*6)

它可以工作 - 但是使用六倍的顶点来获得正确的纹理坐标感觉有点浪费......

4

0 回答 0