glDrawArrays завершает программу с ошибкой
| |
afq | Дата: Воскресенье, 15 Июля 2018, 20:11 | Сообщение # 1 |
Разработчик
Сейчас нет на сайте
| Вот код, здесь загружается рисунок и создаётся координаты vertex для составления квадрата, на котором каждый пиксель будет своего цвета. Я как начал использовать glColorPointer, так всегда завершается с ошибкой, что не так, вот код.
Код #include "Sprite.hpp"
Sprite::Sprite ( long pos ) { //init_texture ( ); }
Sprite::Sprite ( ) { }
void Sprite::load ( long pos ) { std::FILE *fd = std::fopen ( "data", "r" ); if ( !fd ) { std::perror ( "sprite load" ); exit ( EXIT_FAILURE ); }
int ret; ret = std::fseek ( fd, pos, SEEK_SET ); if ( ret == -1 ) { perror ( "fseek\n" ); }
ret = std::fread ( &width, sizeof ( unsigned int ), 1, fd ); if ( ret == -1 ) { perror ( "width\n" ); } ret = std::fread ( &height, sizeof ( unsigned int ), 1, fd ); if ( ret == -1 ) { perror ( "heigth\n" ); } ret = std::fread ( &max_pixels, sizeof ( unsigned int ), 1, fd ); if ( ret == -1 ) { perror ( "max_pixels\n" ); }
pixels = new unsigned char [ max_pixels ]; if ( !pixels ) { printf (" !@!\n" ); }
ret = std::fread ( &pixels[0] , sizeof ( unsigned char ), max_pixels, fd ); if ( ret == -1 ) { perror ( "pixels\n" ); }
vertices = new int [ max_pixels ]; if ( !vertices ) { printf ( "@!@\n" ); } for ( int y = 0; y < 64; y++ ) { for ( int x = 0, i = 0; x < 64; i += 2, x++ ) { vertices[ 0 + ( y * ( 64 - 1 ) + i ) ] = x; vertices[ 1 + ( y * ( 64 - 1 ) + i ) ] = y; } }
std::fclose ( fd ); } void Sprite::render ( ) {
glPushMatrix ( );
#if 0 glFrontFace ( GL_CCW ); glEnable ( GL_CULL_FACE ); glCullFace ( GL_BACK ); #endif
glEnableClientState ( GL_VERTEX_ARRAY ); glEnableClientState ( GL_COLOR_ARRAY );
glVertexPointer ( 2, GL_INT, 0, vertices ); glColorPointer ( 4, GL_UNSIGNED_BYTE, 0, pixels ); // glDrawElements ( GL_POINTS, indices.length, GL_UNSIGNED_BYTE, indices.v ); glDrawArrays ( GL_POINTS, 0, 4096 );
glDisableClientState ( GL_VERTEX_ARRAY ); glDisableClientState ( GL_COLOR_ARRAY );
glDisable ( GL_CULL_FACE ); // glTranslatef ( 0, 0, -10 );
glPopMatrix ( );
glFlush ( ); } void Sprite::init_texture ( ) { }
Добавлено (15 Июля 2018, 18:37) --------------------------------------------- Отредактировал код, щас выводит изображение, но оно не такое, как на картинке. Что же не так. Может неправильно построил вершины. Ну там где
Код for ( int y = 0; y < 64; y++ ) { for ( int x = 0, i = 0; x < 64; i += 2, x++ ) { vertices[ 0 + ( y * ( 64 - 1 ) + i ) ] = x; vertices[ 1 + ( y * ( 64 - 1 ) + i ) ] = y; } }
Добавлено (15 Июля 2018, 20:11) --------------------------------------------- Выводиться какая то билиберда, только не много видны некоторые пиксели, похожие.
Сообщение отредактировал afq - Воскресенье, 15 Июля 2018, 20:10 |
|
| |
DivES | Дата: Воскресенье, 15 Июля 2018, 20:14 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Цитата afq ( ) vertices[ 0 + ( y * ( 64 - 1 ) + i ) ] = x; vertices[ 1 + ( y * ( 64 - 1 ) + i ) ] = y; Тут ошибки нет? В первой строчке точно y*(64 - 1) + i? Ну то есть точно "y", а не "x"?
Сообщение отредактировал DivES - Воскресенье, 15 Июля 2018, 20:14 |
|
| |
afq | Дата: Воскресенье, 15 Июля 2018, 23:06 | Сообщение # 3 |
Разработчик
Сейчас нет на сайте
| DivES, да, y отвечает за вертикаль, x за горизонталь, чтобы в одной строке разместить две координаты x и y, нужно две строки писать. И всё это в один массив наполняется. Добавлено (15 Июля 2018, 21:11) --------------------------------------------- DivES, я знаешь что сделал, и получилось, хаха, щас увидишь, только я думал что хоть с этими функциями будет прозрачный фон, ан нет, вместо прозрачности, черный цвет.
Код vertices = new int [ 8192 ]; if ( !vertices ) { printf ( "@!@\n" ); } #if 1 for ( int y = 0, i = 0; y < height; y++ ) { for ( int x = 0; x < width; i += 2, x++ ) { vertices[ i + 0 ] = x; vertices[ i + 1 ] = y; } }
Добавлено (15 Июля 2018, 22:11) --------------------------------------------- DivES, Всё, получилось, чтобы была прозрачность, нужно дописать две функции, и вот какие.
Код glEnable ( GL_BLEND ); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Добавлено (15 Июля 2018, 23:06) --------------------------------------------- На снимке видно, два изображения головы и квадрат с прозрачностью.
|
|
| |
|