| 
	
		
		
			| 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)---------------------------------------------
 На снимке видно, два изображения головы и квадрат с прозрачностью.
 
  |  |  |  |  |  
 |