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