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

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Как нарисовать спрайт?
Как нарисовать спрайт?
afqДата: Воскресенье, 13 Мая 2018, 19:19 | Сообщение # 1
Разработчик
Сейчас нет на сайте
Могу нарисовать 3d модель с помощью glDrawElements. Потому что известны координаты вершин. Но как рисовать рисунок, где мне вершины найти для рисунка? Например 64 на 64 спрайт. Как вершины найти для такого рисунка?
falcowareДата: Воскресенье, 13 Мая 2018, 19:26 | Сообщение # 2
старожил
Сейчас нет на сайте
afq, берешь 2 треугольника(квадрат), натягиваешь на него текстуру.
afqДата: Воскресенье, 13 Мая 2018, 20:24 | Сообщение # 3
Разработчик
Сейчас нет на сайте
falcoware, сделал квадрат, а он чёрный, изображения нет. Приведу пример кода. Это функция загрузки, пока что п позиции в файле. Получает размеры изображения и все цвета каждого пикселя.
Код

void Sprite::load ( long pos )
{
    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 int [ max_pixels ];

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

    indices.length = max_pixels;
    indices.v = new unsigned char [ indices.length ];
    for ( int i = 0; i < indices.length; i++ ) {
  indices.v[i] = i;
    }
    v = new float [ 3 * 2 ];
    v[0] = 0.0f;
    v[1] = 1.0f;

    v[2] = 1.0f;
    v[3] = 0.0f;

    v[4] = 1.0f;
    v[5] = 1.0f;

    std::fclose ( fd );
}


Вот код рендера. Пока что в 3d, потому как в 2d я так понел нет уже в opengl 4 версии функций. Ну я могу ещё использовать gluOrtho. А пока gluPerspective. Хотел glm использовать, по книжке шедеров, а там параметры для текстуры не были найдены.
Код

void Sprite::render ( )
{
    glBindTexture ( GL_TEXTURE_2D, tex );
    glEnableClientState ( GL_VERTEX_ARRAY );
    glEnableClientState ( GL_TEXTURE_COORD_ARRAY );

    glVertexPointer ( 2, GL_FLOAT, 0, v );
    glTexCoordPointer ( 2, GL_FLOAT, 0, pixels );

    glPushMatrix ( );
    glTranslatef ( 0, 0, -10 );

    glDrawElements ( GL_TRIANGLES, indices.length, GL_UNSIGNED_BYTE, indices.v );
    glPopMatrix ( );

    glDisableClientState ( GL_VERTEX_ARRAY );
    glDisableClientState ( GL_TEXTURE_COORD_ARRAY );
    glFlush ( );
}
falcowareДата: Воскресенье, 13 Мая 2018, 20:34 | Сообщение # 4
старожил
Сейчас нет на сайте
afq, нет, текстуру надо загрузить в GL_TEXTURE_2D.

glTexCoordPointer ( 2, GL_FLOAT, 0, pixels ); - это не пикселы, это текстурные вертексы, они должны быть у тебя 1, 0.
afqДата: Воскресенье, 13 Мая 2018, 21:56 | Сообщение # 5
Разработчик
Сейчас нет на сайте
falcoware, но в 3d рисует правильно. Там содержаться не координаты, а число цвета в rgba формате. То есть надо эти цвета в правильном порядке занести в glTexCoordPointer, а это у меня получилось, потому что повторяю, в 3d рисуется правильно. Но как координаты вершин правильно составить, чтобы координаты правильно отображались? И скорее всего нужно вместе GL_TRIANGLES заменить на GL_POINTS. В общем можешь более наглядно помочь?
falcowareДата: Понедельник, 14 Мая 2018, 09:36 | Сообщение # 6
старожил
Сейчас нет на сайте
afq,
Код

C2DBackgroung::C2DBackgroung()
{
    m_nTexture = 0;

// Faces...
    m_arrFaces.Set(2);
    face_t f1 = {0, 1, 2};
    face_t f2 = {0, 2, 3};

    m_arrFaces[0] = f1;
    m_arrFaces[1] = f2;

// Verts...
    m_arrVerts.Set(4);
    vert_t v1 = { 0.f, 0.f, 0.f, 0.f, 1.f, 0.f };
    vert_t v2 = { 0.f, 0.f, 0.f, 1.f, 1.f, 0.f };
    vert_t v3 = { 0.f, 0.f, 0.f, 1.f, 0.f, 0.f };
    vert_t v4 = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };

    m_arrVerts[0] = v1;
    m_arrVerts[1] = v2;
    m_arrVerts[2] = v3;
    m_arrVerts[3] = v4;
}

C2DBackgroung::~C2DBackgroung()
{

}

#include "bmp_file.h"

BOOL C2DBackgroung::LoadTexture(char *pName)
{
    AUX_RGBImageRec *pTexImage = NULL;

    glPixelStorei(GL_PACK_ALIGNMENT, 1);

    BMP_File bmp;
    if(!bmp.Load(pName)){
//  AfxMessageBox("Can't load 2D Background Image file!");
  return FALSE;
    }

    bmp.FlipY();

    if(m_nTexture){
  glBindTexture(GL_TEXTURE_2D, m_nTexture);
  glDeleteTextures(1, &m_nTexture);
  m_nTexture = 0;
    }

    glGenTextures(1, &m_nTexture);
    glBindTexture(GL_TEXTURE_2D, m_nTexture);
    glEnable(GL_TEXTURE_2D);

//    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
//    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

//    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
//    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, bmp.SizeX(), bmp.SizeY(), GL_RGB, GL_UNSIGNED_BYTE, bmp.Memory());

//    if(pTexImage->data){ free(pTexImage->data); }
//    free(pTexImage);

    return TRUE;
    
}

void C2DBackgroung::Draw()
{
    glEnable(GL_TEXTURE_2D);
    glDisable(GL_LIGHTING);
    glBindTexture(GL_TEXTURE_2D, m_nTexture);

    glDisable(GL_COLOR_MATERIAL);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    
    glVertexPointer(3, GL_FLOAT, sizeof(vert_t), &m_arrVerts[0].x);
    glTexCoordPointer(2, GL_FLOAT, sizeof(vert_t), &m_arrVerts[0].tx);
    glDrawElements(GL_TRIANGLES, m_arrFaces.Size() * 3, GL_UNSIGNED_INT, m_arrFaces.Memory());

    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    
    glDisable(GL_TEXTURE_2D);
}

afqДата: Суббота, 26 Мая 2018, 08:27 | Сообщение # 7
Разработчик
Сейчас нет на сайте
falcoware, а точно, текстурные координаты, я же их в 3d использовал. Но как быть если у меня цвета в int, то есть в одном int сохранено rgba. Как мне тогда построить vertexPointer и texCoordPointer не понимаю, сколько не пробывал, всегда черный квадрат получается. А ещё проблема есть, эти же функции устаревшие и в 4 версии opengl надо использовать glBufferData и attrib, но эти функции пишет что не найдены. Пробывал использовать glm и loadGen, который использует функции opengl 4, но так как я не могу правильно данные упаковать, то и ничего не выводиться. Что же делать, откуда мне узнать как нужно правильно делать если книги по opengl только старые есть, может это в вузах учат?

Добавлено (26 Мая 2018, 08:27)
---------------------------------------------
falcoware, ещё цвета у меня в int, и хотелось бы в этих же значениях выводить, потому что цвет есть цвет из 255 значений.

ugarxxx123Дата: Среда, 12 Декабря 2018, 18:23 | Сообщение # 8
был не раз
Сейчас нет на сайте
Цитата afq ()
потому что цвет есть цвет из 255 значений

нада из одново значения
Форум игроделов » Программирование » C/C++ » Как нарисовать спрайт?
  • Страница 1 из 1
  • 1
Поиск:

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