2013-04-11 3 views
1

Я пытался сделать простое отображение текстуры с ПОЧВЫ, и у меня были странные выходы ..странно GLSL координаты текстуры

Вывод, отображает только когда 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); 
} 

Все мундиры и атрибутам являются подтверждены.

Texture пытается сделать:

image for render (128х128, мощность 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 более не существует. Может ли кто-нибудь объяснить это?

Если мои координаты текстуры находятся в правильном положении, то я начну смотреть на другую библиотеку изображений ..

[EDIT] Я попытался загрузки изображения с помощью сырых каркасная сгенерированных данных, и это была та же проблема. Это как если бы текстурные координаты были одномерными.

+2

Вы должны добавить, как вы настраиваете потоки вершин. Идет вызов glvertexattribpointer и т. Д. – starmole

+0

Из изображения текстурных координат в вашем отладочном шейдере становится ясно, что он вообще не может иметь ничего общего с изображением текстуры. Я второй * starmole *, который в случае, показывающем фактическую настройку формата вершин (и рисование), имеет решающее значение для решения проблемы. –

+0

Где ваши директивы '# version'? – genpfault

ответ

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 вершин.

Все работает отлично.

Удивительно, как такая маленькая опечатка может так сильно сломать ее.

Смежные вопросы