2014-11-09 4 views
1

Я столкнулся с проблемой смещения строк текстуры. В качестве теста я создаю текстуру 512x4 от/до GL_RGBA. sizeof (_color) 4. Это должен быть только градиент, идущий от чёрного до синего на X. Похоже, что он читается со смещения, так как иногда он заканчивается поврежденными результатами, которые длится около 1/3 строки (ширина).Ошибка смещения текстуры OpenGL

Если я изменил шейдер фрагмента для вывода UV-координат на красный и зеленый каналы, я получаю УФ-координаты, которые выглядят так, как будто они правильно установлены, например, 0,0 (TL) 1,0 (TR), 0 , 1 (BL) и 1,1 (BR). В любом случае, я не вижу, что это проблема с УФ.

Я использую SDL2 на OSX, который может быть источником проблемы. Результат хорош в Linux/SDL2, так что я совершенно не знаю, что это за переменная состояния.

OpenGL texture offset

typedef struct { 
    unsigned char r,g,b,a; 
} _color; 

glGenTextures(1, &self->id); 
glBindTexture(GL_TEXTURE_2D, self->id); 

_color* c = (_color*)malloc(sizeof(_color) * 512 * 4); 
_color* pc = c; 
for(int y = 0; y < 4; y++) 
    for(int x = 0; x < 512; x++) { 
     pc->r = 0; 
     pc->g = 0; 
     pc->b = (u_char)((float)x/(float)512 * 255.0); 
     pc->a = 255; 
     pc++; 
    } 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, (void *)c); 

printf("glGetError = %d\n", glGetError()); // Outputs no error 

free(c); 

УФ отображается на gl_FragColor (красный = U, V = зеленый) UV output

Texture поиска изменен на: Texture2D (u_texture, vec2 (v_uv.x, 0.0)); (y принудительно до 0) V (or UV.y) coordinate set to 0

+1

Возможно, проблема с выравниванием. Задайте правильные параметры GL_UNPACK_ ... с помощью glPixelStore перед загрузкой данных текстуры. – datenwolf

+0

Это определенно звучит выполнимо. Я установлю параметры на основе информации, которую я вижу на https://www.opengl.org/sdk/docs/man2/xhtml/glPixelStore.xml (см. Таблицу). – Kyle

+0

Спасибо, GL_UNPACK_ROW_LENGTH был установлен в 640. Это наиболее определенно разница в смещении. Я хотел бы принять это как ответ, если вы опубликуете его как один. – Kyle

ответ

1

Возможно, проблема выравнивания. Задайте правильные параметры GL_UNPACK_ ... с помощью glPixelStore перед загрузкой данных текстуры.

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