Как нарисовать спрайт?
| |
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 значений нада из одново значения
|
|
| |
|