每个元素的纹理坐标而不是GLSL中的每个顶点?

时间:2013-02-20 01:03:25

标签: glsl pygame texture-mapping

我正在尝试用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)

并且它有效 - 但是使用六倍的顶点来获得正确的纹理坐标感觉有点浪费......

0 个答案:

没有答案