Пятница, 30 Сентября 2022, 12:19

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

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

мой twitch канал - https://www.twitch.tv/xverizex
falcowareДата: Воскресенье, 13 Мая 2018, 19:26 | Сообщение # 2
старожил
Сейчас нет на сайте
afq, берешь 2 треугольника(квадрат), натягиваешь на него текстуру.

https://falco3d.com
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 ( );
}


мой twitch канал - https://www.twitch.tv/xverizex
falcowareДата: Воскресенье, 13 Мая 2018, 20:34 | Сообщение # 4
старожил
Сейчас нет на сайте
afq, нет, текстуру надо загрузить в GL_TEXTURE_2D.

glTexCoordPointer ( 2, GL_FLOAT, 0, pixels ); - это не пикселы, это текстурные вертексы, они должны быть у тебя 1, 0.


https://falco3d.com
afqДата: Воскресенье, 13 Мая 2018, 21:56 | Сообщение # 5
Разработчик
Сейчас нет на сайте
falcoware, но в 3d рисует правильно. Там содержаться не координаты, а число цвета в rgba формате. То есть надо эти цвета в правильном порядке занести в glTexCoordPointer, а это у меня получилось, потому что повторяю, в 3d рисуется правильно. Но как координаты вершин правильно составить, чтобы координаты правильно отображались? И скорее всего нужно вместе GL_TRIANGLES заменить на GL_POINTS. В общем можешь более наглядно помочь?

мой twitch канал - https://www.twitch.tv/xverizex
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);
}



https://falco3d.com
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 значений.


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

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

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