2013-04-11 218 views
1

我一直試圖做簡單的紋理映射與土壤,並在加載PNG紋理我一直有奇怪的輸出..離奇GLSL紋理座標

輸出僅顯示。 (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生成的數據加載圖像,並有同樣的問題。 就好像紋理座標是一維的。

+2

你應該添加你設置頂點流的方式。 glvertexattribpointer等調用。 – starmole 2013-04-11 06:00:43

+0

從描繪調試着色器中的紋理座標可以清楚地看出,它根本不可能與紋理圖像有任何關係。我第二* starmole *,在顯示實際頂點格式設置(和繪圖)的情況下,對於解決問題至關重要。 – 2013-04-11 07:53:52

+0

你的'#版本'指令在哪裏? – genpfault 2013-04-11 16:46:05

回答

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)); 

的2 (void*) (sizeof(GLfloat) * 2));應該是一個3,因爲有3頂點座標。

現在一切正常。

令人驚訝的是,這樣一個小錯字如何破壞它如此糟糕。