Суббота, 09 Ноября 2024, 02:27

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
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)
---------------------------------------------
На снимке видно, два изображения головы и квадрат с прозрачностью.

  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг