| |
| Программирование для PSP Вы программист? Welcome сюда... |
15.04.2018, 20:23
|
Сообщение: #1 (1140180)
|
Модель консоли: PSPgo-N1001
Прошивка: 6.35
Регистрация: 08.10.2010
Сообщений: 7
Вы сказали Спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Сила репутации: 0Репутация: 0 
(пока ничем не отличился)
|
Продолжив мучатся я понял, что намного проще будет использовать библиотеки совместимые с RISC архитектурой. Впрочем, как в PSPSDK и понапихано  Поэтому нашел простенький png загрузчик использующий использующий png.h:
#ifndef __IMAGE_H__
#define __IMAGE_H__
#include <stdlib.h>
#include <stdio.h>
#include <png.h>
#include "StructsExtended.h"
class Image
{
public:
int width, height;
png_byte color_type;
png_byte bit_depth;
png_bytep *row_pointers;
void read_png_file(const char *path);
void write_png_file(const char *path);
};
void Image::read_png_file(const char* path)
{
FILE *fp = fopen(path, "rb");
png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png) abort();
png_infop info = png_create_info_struct(png);
if (!info) abort();
if (setjmp(png_jmpbuf(png))) abort();
png_init_io(png, fp);
png_read_info(png, info);
width = png_get_image_width(png, info);
height = png_get_image_height(png, info);
color_type = png_get_color_type(png, info);
bit_depth = png_get_bit_depth(png, info);
// Read any color_type into 8bit depth, RGBA format.
// See http://www.libpng.org/pub/png/libpng-manual.txt
if (bit_depth == 16)
png_set_strip_16(png);
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(png);
// PNG_COLOR_TYPE_GRAY_ALPHA is always 8 or 16bit depth.
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
png_set_expand_gray_1_2_4_to_8(png);
if (png_get_valid(png, info, PNG_INFO_tRNS))
png_set_tRNS_to_alpha(png);
// These color_type don't have an alpha channel then fill it with 0xff.
if (color_type == PNG_COLOR_TYPE_RGB ||
color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_PALETTE)
png_set_filler(png, 0xFF, PNG_FILLER_AFTER);
if (color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb(png);
png_read_update_info(png, info);
row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * height);
for (int y = 0; y < height; y++) {
row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png, info));
}
png_read_image(png, row_pointers);
fclose(fp);
}
void Image::write_png_file(const char *path)
{
int y;
FILE *fp = fopen(path, "wb");
if (!fp) abort();
png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png) abort();
png_infop info = png_create_info_struct(png);
if (!info) abort();
if (setjmp(png_jmpbuf(png))) abort();
png_init_io(png, fp);
// Output is 8bit depth, RGBA format.
png_set_IHDR(
png,
info,
width, height,
8,
PNG_COLOR_TYPE_RGBA,
PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT,
PNG_FILTER_TYPE_DEFAULT
);
png_write_info(png, info);
// To remove the alpha channel for PNG_COLOR_TYPE_RGB format,
// Use png_set_filler().
//png_set_filler(png, 0, PNG_FILLER_AFTER);
png_write_image(png, row_pointers);
png_write_end(png, NULL);
for (int y = 0; y < height; y++) {
free(row_pointers[y]);
}
free(row_pointers);
fclose(fp);
}
#endif // !__IMAGE_H__
Настройка вывода текстур:
Image img_tmp;
img_tmp.read_png_file("bus_d_low.png");
//...
//...
// setup texture
sceGuTexMode(GU_PSM_8888, 0, 0, 0);
sceGuTexImage(0, img_tmp.width, img_tmp.height, img_tmp.width, (void*)img_tmp.row_pointers);
sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGB);
И на выходе получилось следующее...
Последний раз редактировалось DDS(present); 16.04.2018 в 18:43.
|
|
|
|
16.04.2018, 11:42
|
Сообщение: #2 (1140217)
|
Модель консоли: PSP-1004
Прошивка: 6.61 PROMOD-C2p
Другие консоли: Все PSP, все PSV, SCPH-1002, SCPH-102, SCPH-77008, CECH-4208C, SCPH-1000R
Регистрация: 19.03.2008
Адрес: Россия
Сообщений: 5,835
Вы сказали Спасибо: 826
Поблагодарили 3,969 раз(а) в 2,068 сообщениях
Сила репутации: 10Репутация: 3969 
(репутация неоспорима)
|
Боюсь, помощи с графикой долго ждать придётся. У нас разве что Ilsor что-то делал на этот счёт. Смотри его темы, может примеры кода подберёшь какие…
|
|
|
|
16.04.2018, 18:37
|
Сообщение: #3 (1140276)
|
Модель консоли: PSPgo-N1001
Прошивка: 6.35
Регистрация: 08.10.2010
Сообщений: 7
Вы сказали Спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Сила репутации: 0Репутация: 0 
(пока ничем не отличился)
|
Сообщение от Yoti
Боюсь, помощи с графикой долго ждать придётся. У нас разве что Ilsor что-то делал на этот счёт. Смотри его темы, может примеры кода подберёшь какие…
|
Боюсь мне другого и не остается.
Пока что я застрял на правильном отображении текстуры на загружаемом *.obj . Для элементарной отладки нарисовал в Blender'e параллелепипед и натянул на него текстуру "спичечного коробка".
Но, как не странно выходит вот это.
Используя ручную трассировку (на бумажке вырисовывал  ), то получилось так, что по логике вещей все должно работать, поскольку каждый vertex из структуры...
struct Vertex_UVColorNormalXYZ
{
float u, v;
unsigned int color;
float normal_x, normal_y, normal_z;
float x, y, z;
};
...содержит корректные координаты [U,V] для mapping'а.
Единственное, где я действительно плаваю, это текстурные настройки (хотя я уже все перерыл и перепробовал всевозможные комбинации), а так же в выравнивании data текстуры по 16 байт, как требует void sceGuTexImage:
|
Note: Data must be aligned to 1 quad word (16 bytes)
|
Пока же data от текстуры просто
png_bytep *row_pointers;
// а он в свою очередь
typedef png_byte FAR * png_bytep;
//т.е.
typedef unsigned char png_byte;
Оказалось, что дело было в выравнивании.
Вот, настряпал "страшный код", для большего понимания того, что происходит, и, как оказалось, на нем все заработало...
struct COLOR
{
unsigned char r, g, b, a;
};
struct COLOR __attribute__((aligned(16))) *img_data = (struct COLOR __attribute__((aligned(16))) *)malloc(sizeof(struct COLOR __attribute__((aligned(16)))) * img_tmp.width * img_tmp.height);
unsigned long img_index = 0;
for (int y = 0; y < img_tmp.height; y++)
{
for (int x = 0; x < img_tmp.width * img_tmp.bit_depth; x += 4)
{
img_data[img_index].r = img_tmp.row_pointers[y][x];
img_data[img_index].g = img_tmp.row_pointers[y][x + 1];
img_data[img_index].b = img_tmp.row_pointers[y][x + 2];
img_data[img_index].a = img_tmp.row_pointers[y][x + 3];
img_index++;
}
}
Т.е. я просто перевел в RGBA структуру с выравниванием по 16 байт, как требует sdk. И вот какой результат вышел.
Правда, как вы могли заметить, некоторые элементы теряются (в основном обрезанные края текстуры). Например: "шеркалка" вовсе съехала. Да и сама картинка имеет нечеткое отображение.
О боже... Все оказалось намного проще.
Image::read_png_file как-то повернул / перевернул картинку. Я сейчас просто сижу и пытаюсь подобрать алгоритм, чтобы ее восстановить так, чтобы UV координаты оказались на нужных местах
PS: так и не понятно для чего нужно выравнивание...
Наконец-то. Оказалось, что в png_bytep, в котором хранилась текстура был далеко не "квадратным" динамическим массивом, и количество столбцов каждой строки было разным, поэтому пришлось добавить немного ухищрений для того, чтобы правильно пересобрать текстуру.
public:
//...
// для хранения количества столбцов каждой строки
png_size_t *row_weight_size;
//...
// в void Image::read_png_file
row_weight_size = (png_size_t *)malloc(sizeof(png_size_t) * height);
row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * height);
for (int y = 0; y < height; y++) {
row_weight_size[y] = png_get_rowbytes(png, info);
row_pointers[y] = (png_byte*)malloc(row_weight_size[y]);
}
//...
// функция восстановления текстуры
void Image::png_data(struct COLOR *img_data)
{
unsigned long img_data_index = 0;
for (int y = height - 1; y >= 0; y--) {
for (int x = 0; x < row_weight_size[y]; x+=4) {
img_data[img_data_index].r = row_pointers[y][x];
img_data[img_data_index].g = row_pointers[y][x + 1];
img_data[img_data_index].b = row_pointers[y][x + 2];
img_data[img_data_index].a = row_pointers[y][x + 3];
img_data_index++;
}
}
}
И непосредственно сам вызов:
Image img_tmp;
img_tmp.read_png_file("Models/matchbook.png");
struct COLOR *img_data = (struct COLOR*)malloc(sizeof(struct COLOR) * img_tmp.height * img_tmp.width);
img_tmp.png_data(img_data);
Спичечный коробок
Автобус
Последний раз редактировалось vash; 17.04.2018 в 19:05.
Причина: По одному поводу
|
|
|
|
28.05.2019, 21:38
|
Сообщение: #4 (1182365)
|
Регистрация: 17.05.2019
Возраст: 25
Сообщений: 1
Вы сказали Спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Сила репутации: 0Репутация: 0 
(пока ничем не отличился)
|
Как работать с библиотеками при портировании игр на PSP?
|
|
|
|
04.02.2024, 00:03
|
Сообщение: #5 (1279011)
|
Модель консоли: PS4
Прошивка: Последняя
Другие консоли: RPCS3, PS Vita, PS2, Xbox 360, Nintendo Switc lite.
Регистрация: 03.12.2023
Возраст: 25
Сообщений: 20
Вы сказали Спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Сила репутации: 0Репутация: 0 
(пока ничем не отличился)
|
|
|
|
|
04.02.2024, 06:08
|
Сообщение: #6 (1279022)
|
Модель консоли: PSP-1004
Прошивка: 6.60 PROMOD
Другие консоли: iPad 3 WiFi
Регистрация: 18.12.2006
Адрес: Москва
Возраст: 58
Сообщений: 47,758
Вы сказали Спасибо: 27,999
Поблагодарили 43,818 раз(а) в 12,400 сообщениях
Сила репутации: 10Репутация: 43009 
(репутация неоспорима)
|
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 05:58. Часовой пояс GMT +3.
Powered by vBulletin® Version 3.8.7 Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
PSPx Forum - Сообщество фанатов игровых консолей.
|
|
|