奇怪的GLSL纹理坐标

时间:2013-04-11 04:57:31

标签: opengl coordinates textures

我一直在尝试使用SOIL进行简单的纹理映射,而且我一直有奇怪的输出..

仅在加载PNG纹理时显示输出。 (SOIL_load_OGL_texture) 其他纹理显示为灰色或白色。

顶点传递为:

struct Vertex {
    float position[3];
    float texturepos[2];
};

Vertex vertices[] = { // w and h are width and height of square.
    0,0,0,0,0,
    w,0,0,1,0,
    0,h,0,0,1,
    w,0,0,1,0,
    w,h,0,1,1,
    0,h,0,0,1
};

顶点着色器:

attribute vec2 texpos;
attribute vec3 position;
uniform mat4 transform;
varying vec2 pixel_texcoord;
void main(void) {
    gl_Position=transform * vec4(position,1.0);
    pixel_texcoord=texpos;
}

片段着色器:

varying vec2 pixel_texcoord;
uniform sampler2D texture;
void main(void) {
    gl_FragColor=texture2D(texture,pixel_texcoord);
}

所有制服和属性都经过验证。

尝试渲染的纹理:

image for render (是128x128,2的幂。)

输出[使用普通着色器]:

output1

但是,我认为问题完全在于我尝试调试时发生的奇怪事情。

我将片段着色器更改为:

varying vec2 pixel_texcoord;
uniform sampler2D texture;
void main(void) {
    gl_FragColor=vec4(pixel_texcoord.x,0,pixel_texcoord.y,1);
}

得到结果: output2 纹理坐标出现问题,因为根据着色器,Y现在为X,X不再存在。 谁能解释一下呢?

如果我的纹理坐标位置正确,那么我将开始查看另一个图像库..

[编辑]我尝试通过原始gimp生成的数据加载图像,它也遇到了同样的问题。 它好像纹理坐标是1维的。

1 个答案:

答案 0 :(得分:0)

发现问题了!感谢starmole的建议,我又看了一下glVertexAttribPointer调用,格式如下:

glVertexAttribPointer(attribute_vertex,3,GL_FLOAT,GL_FALSE,sizeof(Vertex),0);
glVertexAttribPointer(attribute_texture_coordinate,2,GL_FLOAT,GL_FALSE,sizeof(Vertex),(void*) (sizeof(GLfloat) * 2));

(void*) (sizeof(GLfloat) * 2));中的2应该是3,因为有3个顶点坐标。

现在一切都很完美。

令人惊讶的是,如此小的拼写错误会如此糟糕地打破它。