我正在尝试使用 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)
它可以工作 - 但是使用六倍的顶点来获得正确的纹理坐标感觉有点浪费......