Суббота, 20 Апреля 2024, 16:35

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Вывод спрайта и его прозрачность
Вывод спрайта и его прозрачность
afqДата: Вторник, 03 Июля 2018, 06:18 | Сообщение # 1
Разработчик
Сейчас нет на сайте
Никак не могу понять, можно ли сделать прозрачность спрайта без шейдеров, а то я никак не могу понять как шейдеры использовать, почему нужно то и то писать и где вся инфа по шейдерам есть, раз уж на то пошло.

Проблема вот в чем. Далее будет предоставлен код, это для 2d. Если я не устанавливаю glOrtho, то спрайт рисуется, но большого размера. Если установлю glOrtho, то рисуется только черный квадрат. Ещё была функция какая то, уже не помню как называется, он ещё двигается с помощью glRasterpos, она тоже рисует там где должно быть прозрачно, черным цветом. Из-за того, что не устанавливаю glortho, приходится координаты ставить в 0, 1 и тому подобное. Вот код.
Код

#include "Sprite.hpp"

Sprite::Sprite ( )
{
}

void Sprite::load ( long pos )
{
    init_texture ( );
    std::FILE *fd = std::fopen ( "data", "r" );
    if ( !fd ) {
  std::perror ( "sprite load" );
  exit ( EXIT_FAILURE );
    }

    std::fseek ( fd, pos, SEEK_SET );

    std::fread ( &width, sizeof ( unsigned int ), 1, fd );
    std::fread ( &height, sizeof ( unsigned int ), 1, fd );
    std::fread ( &max_pixels, sizeof ( unsigned int ), 1, fd );

    pixels = new unsigned char [ max_pixels ];

//    for ( int i = 0; i < max_pixels; i++ ) {
  std::fread ( &pixels[0] , sizeof ( unsigned char ), max_pixels, fd );
//    }

#if 0
    vertices = new float [ 8 ] {
  0, 64,
  0, 0,
  64, 0,
  64, 64
    };
    texture = new float [ 8 ] {
  64, 0,
  0, 0,
  0, 64,
  64, 64
    };
#endif
#if 1
    vertices = new float [ 8 ] {
  0, 1,
  0, 0,
  1, 0,
  1, 1
    };
    texture = new float [ 8 ] {
  1, 0,
  0, 0,
  0, 1,
  1, 1
    };
#endif

    indices.length = 6;
    indices.v = new unsigned char [ indices.length ] {
  0, 1, 2,
  0, 2, 3
    };

    std::fclose ( fd );
}
void Sprite::render ( )
{
#if 1
    glEnable ( GL_TEXTURE_2D );
    glBindTexture ( GL_TEXTURE_2D, tex );

    glPushMatrix ( );

#if 0
    glFrontFace ( GL_CCW );
    glEnable ( GL_CULL_FACE );
    glCullFace ( GL_BACK );
#endif

    glEnableClientState ( GL_VERTEX_ARRAY );
    glEnableClientState ( GL_TEXTURE_COORD_ARRAY );

    glVertexPointer ( 2, GL_FLOAT, 0, vertices );
    glTexCoordPointer ( 2, GL_FLOAT, 0, texture );
    glDrawElements ( GL_TRIANGLES, indices.length, GL_UNSIGNED_BYTE, indices.v );

    glDisableClientState ( GL_VERTEX_ARRAY );
    glDisableClientState ( GL_TEXTURE_COORD_ARRAY );

    glDisable ( GL_CULL_FACE );
    glTranslatef ( 0, 0, 2 );

    glPopMatrix ( );

    glFlush ( );
    glDisable ( GL_TEXTURE_2D );
#endif
}
void Sprite::init_texture ( )
{
    glGenTextures ( 1, &tex );
    glBindTexture ( GL_TEXTURE_2D, tex );

    glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER );
    glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER );
    glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER );

    glTexImage2D ( GL_TEXTURE_2D,
   0,
   GL_RGBA,
   width,
   height,
   0,
   GL_RGBA,
   GL_UNSIGNED_BYTE,
   pixels );

    glEnable ( GL_TEXTURE_2D );

}
Snake174Дата: Вторник, 03 Июля 2018, 07:00 | Сообщение # 2
участник
Сейчас нет на сайте
Мне кажется, или init_texture ( ); нужно вызывать после того, как ты заполнишь массив pixels?

Не следует обманывать инспектора
Pipmak Assistant
Love2D Exporter
Love2D-Helpers
Old Consoles Games
afqДата: Вторник, 03 Июля 2018, 07:12 | Сообщение # 3
Разработчик
Сейчас нет на сайте
Snake174, да ты совершенно прав. Я это поменял в последний момент, подумал что в конструкторе лучше не создавать ничего, потому как если выясниться что файл отсутствует или другая ошибка, то освободить память я не смогу, потому что конструктор не выполнится до конца, а отсюда и то, что деструктор тогда не вызовется. Я init_texture перенес без задней мысли из конструктора в начало фунцкии и забыл о приоритетах, но если поместить эту функцию в конец, то будет работать, но так как я написал в начале темы, то есть без прозрачности и glOrtho.
Snake174Дата: Вторник, 03 Июля 2018, 07:31 | Сообщение # 4
участник
Сейчас нет на сайте
Код вывода спрайта покажи.

Вот процедура загрузки png изображений из моего старого проекта. Обрати внимание на цикл.

Код

void CubeMapViewer::loadPNGTexture( const QString &fileName, unsigned int &id )
{
  QImage image = QImage( fileName );

  glGenTextures( 1, &id );
  glBindTexture( GL_TEXTURE_2D, id );
  GLuint *pTexData = new GLuint[ image.width() * image.height() ];
  GLuint *sdata = (GLuint *)image.bits();
  GLuint *tdata = pTexData;

  for (int y = 0; y < image.height(); ++y)
  {
    for (int x = 0; x < image.width(); ++x)
    {
      *tdata = ((*sdata & 255) << 16) | (((*sdata >> 8) & 255) << 8)
          | (((*sdata >> 16) & 255) << 0) | (((*sdata >> 24) & 255) << 24);
      ++sdata;
      ++tdata;
    }
  }

  glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData );
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
  glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0x812F );
  glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 0x812F );
  glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );

  delete[] pTexData;
  pTexData = 0;
}


Не следует обманывать инспектора
Pipmak Assistant
Love2D Exporter
Love2D-Helpers
Old Consoles Games


Сообщение отредактировал Snake174 - Вторник, 03 Июля 2018, 07:50
afqДата: Вторник, 03 Июля 2018, 08:07 | Сообщение # 5
Разработчик
Сейчас нет на сайте
Snake174, я тоже раньше в int помещал все четыре цвета. А потом понел что можно по одному ( unsigned char ) для каждого цвета писать в массив, а потом за раз записать в data файл весь массив. И также прочесть одним разом без цикла. Я сегодня поменял и теперь за один раз считывает все цвета из data файла. Сначала размеры считываются, потом количество пикселей, а потом за раз требуемая длина, так лучше.

Добавлено (03 Июля 2018, 08:07)
---------------------------------------------
Snake174, а почему ты показываешь старый проект? Как там рисунок отображается, с прозрачностью?

Snake174Дата: Вторник, 03 Июля 2018, 08:56 | Сообщение # 6
участник
Сейчас нет на сайте
Цитата afq ()
Snake174, а почему ты показываешь старый проект? Как там рисунок отображается, с прозрачностью?

Да, с прозрачностью. Старый потому что времени нет его допиливать )

Тут тоже всё разом считывается. В цикле то как раз и делается, чтобы было прозрачно. Без него у меня неправильно отображалось.


Не следует обманывать инспектора
Pipmak Assistant
Love2D Exporter
Love2D-Helpers
Old Consoles Games


Сообщение отредактировал Snake174 - Вторник, 03 Июля 2018, 08:58
afqДата: Вторник, 03 Июля 2018, 11:08 | Сообщение # 7
Разработчик
Сейчас нет на сайте
Snake174, можешь снимок предоставить прозрачного спрайта?
Snake174Дата: Вторник, 03 Июля 2018, 13:08 | Сообщение # 8
участник
Сейчас нет на сайте
https://github.com/Snake174/PipmakAssistant/blob/master/res/ramka.png

http://snake174.github.io/html/programs/pipmak_assistant.html - на первом скрине она.

Да любой файл с прозрачностью скачай и всё.


Не следует обманывать инспектора
Pipmak Assistant
Love2D Exporter
Love2D-Helpers
Old Consoles Games


Сообщение отредактировал Snake174 - Вторник, 03 Июля 2018, 13:10
afqДата: Среда, 11 Июля 2018, 12:14 | Сообщение # 9
Разработчик
Сейчас нет на сайте
Snake174, я так понел ты с gl_Begin делал, у меня так тоже с прозрачностью рисовался. Но на нетбуке тормозило если несколько рисунков надо было нарисовать, потому что пока в цикле все поинты нарисуются, пройдет время.
Snake174Дата: Среда, 11 Июля 2018, 17:11 | Сообщение # 10
участник
Сейчас нет на сайте
Да скинь ты уже весь код.

Могу на java скинуть без glBegin если надо.


Не следует обманывать инспектора
Pipmak Assistant
Love2D Exporter
Love2D-Helpers
Old Consoles Games
afqДата: Среда, 11 Июля 2018, 17:58 | Сообщение # 11
Разработчик
Сейчас нет на сайте
Snake174, давай на java. Весь код? Сюда? Или на github?
Snake174Дата: Четверг, 12 Июля 2018, 07:34 | Сообщение # 12
участник
Сейчас нет на сайте


Не следует обманывать инспектора
Pipmak Assistant
Love2D Exporter
Love2D-Helpers
Old Consoles Games
Форум игроделов » Программирование » C/C++ » Вывод спрайта и его прозрачность
  • Страница 1 из 1
  • 1
Поиск:

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