Воскресенье, 05 Июля 2020, 17:17

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Записи участника » afq [624]
Результаты поиска
afqДата: Пятница, 10 Января 2020, 18:13 | Сообщение # 81 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
Xakep,
Цитата
Но как минимум ты делаешь опять ту же ошибку, что и в предыдущем примере - `length_v` нужно делить на 3 в `glDrawArrays`, т.к. у тебя 3 компонента на вершину.
ну я не понимаю. а сколько тогда надо рисовать. если у меня допустим 6 компонентов?


мозги << знания << опыт << старания
afqДата: Среда, 08 Января 2020, 23:53 | Сообщение # 82 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
Xakep, у меня ещё есть проблема с model.cpp. выложу сюда код. я загружаю модель obj формата. но этот формат изначально преобразую с помощью утилиты в tools. зря я наверное удалил примеры. там были объекты из blender. так вот. я проверял, все координаты правильно считываются. но проблема в том что рисуется только один треугольник. в gldrawarrays я задаю общее количество вершин поделенное на три. думаю так правильно рисовать треугольники. шейдер с тенями я пока не осилил, но есть книга где написано как тени делать, но мне пока не надо это. приведу пример шейдера без текстуры и исходника model.
Код

#version 300 es
layout ( location = 0 ) in vec3 position;
layout ( location = 1 ) in vec3 normaly;
layout ( location = 2 ) in vec4 color;
uniform mat4 transform;
uniform mat4 perspective;
uniform mat4 rotate;
out vec4 v_color;

void main ( )
{
  gl_Position = perspective * transform * vec4 ( position, 1.0 );
  v_color = color;
}

Код

#version 300 es
precision mediump float;
in vec4 v_color;
layout ( location = 0 ) out vec4 out_color;
void main ( )
{
  out_color = v_color;
}

Код

#ifndef __MODEL_H__
#define __MODEL_H__
#include "../glm/glm.hpp"
#include "../glm/ext.hpp"
#include "sprite.h"
#include "object.h"
#include "types.h"

struct frame {
    unsigned int length_v;
    unsigned int length_vt;
    unsigned int length_vn;

    float *v;
    float *vn;
    float *vt;

    unsigned int current_length;
};

struct with_t {
    int sampler_location;
    int transform_location;
    int perspective_location;
    int rotate_location;
};

struct without_t {
    int transform_location;
    int perspective_location;
    int rotate_location;
};

class Model : public Object {
    private:
  glm::mat4 proj;
  glm::mat4 view;
  glm::mat4 model;
  glm::mat4 rotate;
  glm::mat4 result;

  glm::vec4 color;

  struct frame *frames;

  unsigned int current_frame;

  unsigned int program_wit;
  unsigned int program_wiot;

  struct with_t wit;
  struct without_t wiot;

  unsigned int textureid;

  friend void draw_with_texture ( Model * );
  friend void draw_without_texture ( Model * );

  void (*map) ( Model * );

    public:
  int get_type ( ) {
   return Type::MODEL;
  }
  float x;
  float y;
  float z;
  Model ( );
  void read_file ( const char *file ) override;
  void draw ( ) override;
  void set_color ( glm::vec4 color );
  void switch_to ( void );
  void transform ( const glm::vec3 &translate );
  Sprite *texture;
};
#endif

Код

#include "model.h"
#include <stdio.h>
#include <string.h>
#include "vars.h"
#include "conf.h"
#include "gl.h"

extern struct conf cf;

Model::Model ( ) {
    this->frames = nullptr;
    this->texture = nullptr;

    float aspect = ( float ) cf.screen_width / ( float ) cf.screen_height;

    this->proj = glm::perspective ( glm::radians ( 45.f ), aspect, 0.0f, 100.f );
    this->view = glm::translate ( glm::mat4 ( 1.0f ), glm::vec3 ( 0.f, 0.f, 0.f ) );
    this->model = glm::mat4 ( 1.0f );
    this->rotate = glm::mat4 ( 1.0f );

    this->current_frame = 0;

    this->program_wit = cf.programs [ SHADER_MODEL_WITH_TEXTURE ];
    this->program_wiot = cf.programs [ SHADER_MODEL_WITHOUT_TEXTURE ];

    int error;
    glUseProgram ( this->program_wit );
    this->wit.sampler_location = glGetUniformLocation ( this->program_wit, "s_texture" );
    this->wit.transform_location = glGetUniformLocation ( this->program_wit, "transform" );
    this->wit.perspective_location = glGetUniformLocation ( this->program_wit, "perspective" );
    this->wit.rotate_location = glGetUniformLocation ( this->program_wit, "rotate" );

    glUseProgram ( this->program_wiot );
    this->wiot.transform_location = glGetUniformLocation ( this->program_wiot, "transform" );
    this->wiot.perspective_location = glGetUniformLocation ( this->program_wiot, "perspective" );
    this->wiot.rotate_location = glGetUniformLocation ( this->program_wiot, "rotate" );
}

void Model::transform ( const glm::vec3 &translate ) {
    this->x = translate.x;
    this->y = translate.y;
    this->z = translate.z;
    this->view = glm::translate ( this->model, translate );
}

void Model::set_color ( glm::vec4 color ) {
    this->color = color;
}

void draw_with_texture ( Model *m ) {
    glUseProgram ( m->program_wit );

    glActiveTexture ( GL_TEXTURE0 );
    glBindTexture ( GL_TEXTURE_2D, m->textureid );

    glUniform1i ( m->wit.sampler_location, 0 );
    glUniformMatrix4fv ( m->wit.transform_location, 1, GL_FALSE, &m->view[0][0] );
    glUniformMatrix4fv ( m->wit.perspective_location, 1, GL_FALSE, &m->proj[0][0] );
    glUniformMatrix4fv ( m->wit.rotate_location, 1, GL_FALSE, &m->rotate[0][0] );

    glEnableVertexAttribArray ( 0 );
    glEnableVertexAttribArray ( 1 );
    glEnableVertexAttribArray ( 2 );

    glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, m->frames[m->current_frame].v );
    glVertexAttribPointer ( 1, 3, GL_FLOAT, GL_FALSE, 0, m->frames[m->current_frame].vn );
    glVertexAttribPointer ( 2, 2, GL_FLOAT, GL_FALSE, 0, m->frames[m->current_frame].vt );

    glDrawArrays ( GL_TRIANGLES, 0, m->frames[m->current_frame].length_v );

    glDisableVertexAttribArray ( 0 );
    glDisableVertexAttribArray ( 1 );
    glDisableVertexAttribArray ( 2 );
}

void draw_without_texture ( Model *m ) {
    glUseProgram ( m->program_wiot );

    glUniformMatrix4fv ( m->wiot.transform_location, 1, GL_FALSE, &m->view[0][0] );
    glUniformMatrix4fv ( m->wiot.perspective_location, 1, GL_FALSE, &m->proj[0][0] );
    glUniformMatrix4fv ( m->wiot.rotate_location, 1, GL_FALSE, &m->rotate[0][0] );

    glEnableVertexAttribArray ( 0 );
    glEnableVertexAttribArray ( 1 );
    glEnableVertexAttribArray ( 2 );

    glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, m->frames[m->current_frame].v );
    glVertexAttribPointer ( 1, 3, GL_FLOAT, GL_FALSE, 0, m->frames[m->current_frame].vn );
    glVertexAttribPointer ( 2, 4, GL_FLOAT, GL_FALSE, 0, &m->color[0] );

    glDrawArrays ( GL_TRIANGLES, 0, m->frames[m->current_frame].current_length  );

    glDisableVertexAttribArray ( 0 );
    glDisableVertexAttribArray ( 1 );
    glDisableVertexAttribArray ( 2 );
}

void Model::switch_to ( ) {
    if ( this->texture ) this->map = draw_with_texture;
    else this->map = draw_without_texture;
}

void Model::draw ( ) {
    this->map ( this );
}

void Model::read_file ( const char *file ) {
    int count;

    char path[255] = { 0 };
    snprintf ( path, 254, "%s/models/%s", DEFAULT_ASSETS, file );
    FILE *fp = fopen ( path, "r" );
    fread ( &count, sizeof ( int ), 1, fp );
    this->frames = new struct frame [ count ];

    for ( int i = 0; i < count; i++ ) {
  fread ( &this->frames[i].length_v,  sizeof ( unsigned int ), 1, fp );
  fread ( &this->frames[i].length_vt, sizeof ( unsigned int ), 1, fp );
  fread ( &this->frames[i].length_vn, sizeof ( unsigned int ), 1, fp );

  this->frames[i].current_length = this->frames[i].length_v / 3;

  this->frames[i].v  = new float [ this->frames[i].length_v ];
  this->frames[i].vt = new float [ this->frames[i].length_vt ];
  this->frames[i].vn = new float [ this->frames[i].length_vn ];

  fread ( &this->frames[i].v[0],  sizeof ( float ), this->frames[i].length_v, fp );
  fread ( &this->frames[i].vn[0], sizeof ( float ), this->frames[i].length_vn, fp );
  fread ( &this->frames[i].vt[0], sizeof ( float ), this->frames[i].length_vt, fp );
    }

    fclose ( fp );
}


мозги << знания << опыт << старания
afqДата: Среда, 08 Января 2020, 11:10 | Сообщение # 83 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
Xakep, спасибо.

мозги << знания << опыт << старания
afqДата: Среда, 08 Января 2020, 11:10 | Сообщение # 84 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
drcrack, ну фиг знает. я с играми долго не связывался потому что контента не было. а щас вроде начал рисовать и появилась возможность делать игру.

мозги << знания << опыт << старания
afqДата: Среда, 08 Января 2020, 07:28 | Сообщение # 85 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
Xakep, ну когда же ты проверишь? У тебя доступ к компьтеру чтоли ограничен? :)

мозги << знания << опыт << старания
afqДата: Вторник, 07 Января 2020, 18:26 | Сообщение # 86 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
Xakep, всё выложил код. github

только я пока в коде не делал удаление объектов, потому что пока на этапе меню зациклился и рисования. может даже код заценишь. но вряд ли. ты ведь хотел только запустить. ну а так если поймешь код, то может совет какой нибудь дашь. ) ладно, все.


мозги << знания << опыт << старания
afqДата: Вторник, 07 Января 2020, 03:43 | Сообщение # 87 | Тема: текстура спрайта как nearest в unity
Разработчик
Сейчас нет на сайте
drcrack, о спасибо.

мозги << знания << опыт << старания
afqДата: Вторник, 07 Января 2020, 03:12 | Сообщение # 88 | Тема: текстура спрайта как nearest в unity
Разработчик
Сейчас нет на сайте
попробывал несколько дней назад unity. вот я добавил spritesheet. когда он разрезался как multiple или с помощью sprite editor, спрайт стал похож, будто в glTexImage2d его отфильтровали с помощью параметра LINEAR, а это нечеткое изображение. а пиксельная графика должна быть с NEAREST. но в opengl я знаю, а как это в unity установить не знаю. надеюсь вы знаете что это за параметры. в общем пиксельная графика должна быть четкая, а в unity по умолчанию у меня получилась размытая. и не нашел я параметры, где можно установить нужные значения. Подскажите.

может кто нибудь даст свой дискорд, чтобы мне могли помогать оперативно?


мозги << знания << опыт << старания
afqДата: Вторник, 07 Января 2020, 02:59 | Сообщение # 89 | Тема: Пиксель - арт.
Разработчик
Сейчас нет на сайте
рисую для игры. может смогу сделать эту игру.


мозги << знания << опыт << старания
afqДата: Вторник, 07 Января 2020, 02:38 | Сообщение # 90 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
Xakep, уменьшил размер кнопок и линии исчезли. я уже обрадывался. а потом запустил ещё раз и линии появились. ошибка наблюдается только при создании кнопок. если кнопки создать, но не рисовать, то ошибка наблюдается. если кнопки вообще не создавать, то ошибки не видно. в кнопке есть объекты: box и font. box - отвечает за вывод например прямоугольника. но в коде вроде тоже все нормально. блин. если не получиться исправить, то придется переходить на unity.

мозги << знания << опыт << старания
afqДата: Понедельник, 06 Января 2020, 22:15 | Сообщение # 91 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
Xakep, а понятно. цвет текстуры умножается на оттенок. получается ну типа оттенка. ну я понял, даже если не правильно объяснил.

мозги << знания << опыт << старания
afqДата: Понедельник, 06 Января 2020, 19:39 | Сообщение # 92 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
Xakep,
Цитата
в glVertexAttribPointer ты задаешь 2 компонента для вершины, следовательно у тебя на один квад идет вместо 4х вершин - 6. Отсюда могут быть и проблемы.

точно могут быть проблемы? я в шейдере принимаю vec2 и преобразую к vec3. вот так.
Код

#version 300 es
layout ( location = 0 ) in vec2 position;
layout ( location = 1 ) in vec2 texCoord;
uniform mat4 transform;
uniform mat4 ortho;
out vec2 v_tex_coord;
void main ( )
{
        gl_Position = ortho * transform * vec4 ( position, 0.0, 1.0 );
        v_tex_coord = texCoord;
}


мозги << знания << опыт << старания
afqДата: Понедельник, 06 Января 2020, 19:36 | Сообщение # 93 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
Xakep,
по поводу твоего шейдера. я не очень понял совет. тот код, который я привел, там
Код

                        data [ 4 * i + 3 ] = w->w [ i ];

здесь я задаю aplha канал. а в остальные компоненты цвет rgb. а твой пример не понял. что если текстуру умножить на цвет, а откуда я цвет возьму? ведь у каждого пикселя буквы свой aplha цвет.


мозги << знания << опыт << старания
afqДата: Понедельник, 06 Января 2020, 17:42 | Сообщение # 94 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
nadgobonom,
Цитата
В атлас шрифт засунь и выводи прямоугольники с батчингом.

это как?


мозги << знания << опыт << старания
afqДата: Понедельник, 06 Января 2020, 17:18 | Сообщение # 95 | Тема: Мои работы blender+painter
Разработчик
Сейчас нет на сайте
прикольно, прикольно.

мозги << знания << опыт << старания
afqДата: Понедельник, 06 Января 2020, 17:16 | Сообщение # 96 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
DivES, не знаю. вроде нет. по крайней мере в opengl es 3.0 и далее нет таких функций glRaster*, и т.д. или ты знаешь как вывести текст с помощью opengl? я видел ещё примеры и все они наточены на то, чтобы выводить текст и запрограммированы по разному. то есть скорее всего да, opengl не может вывести текст сразу, надо подготовить ресурсы.

мозги << знания << опыт << старания
afqДата: Понедельник, 06 Января 2020, 16:56 | Сообщение # 97 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
Xakep, не может быть. вот смотри. я создаю область куда наложить текстуру. эта область проверена. с помощью неё я рисую и прямоугольники и другие спрайты. то есть я создаю область для вершин и область для текстуры. вот так.
Код

void Font::word_set_size ( struct word *word, int w, int h ) {
        if ( !word->vertex ) word->vertex = new float [ 12 ];
        if ( !word->texture ) word->texture = new float [ 12 ];

        word->vertex[0] = 0;
        word->vertex[1] = 0;
        word->vertex[2] = 0;
        word->vertex[3] = h;
        word->vertex[4] = w;
        word->vertex[5] = 0;
        word->vertex[6] = w;
        word->vertex[7] = 0;
        word->vertex[8] = w;
        word->vertex[9] = h;
        word->vertex[10] = 0;
        word->vertex[11] = h;

        word->texture[0] = 0;
        word->texture[1] = 1;
        word->texture[2] = 0;
        word->texture[3] = 0;
        word->texture[4] = 1;
        word->texture[5] = 1;
        word->texture[6] = 1;
        word->texture[7] = 1;
        word->texture[8] = 1;
        word->texture[9] = 0;
        word->texture[10] = 0;
        word->texture[11] = 0;
}

они получаються либо квадратными, либо прямоугольными.
вот как я создаю текстуру. есть ещё функция по вставке другого цвета. она аналогична почти.
Код

void Font::build_texture ( struct word *w ) {
        unsigned int size = w->width * 4 * w->height;
        unsigned char *data = (unsigned char *) calloc ( size, 1 );

        for ( unsigned int i = 0, y = 0; y < w->height; y++ ) {
                for ( int x = 0; x < w->width; x++ ) {
                        data [ 4 * i + 3 ] = w->w [ i ];
                        data [ 4 * i + 0 ] = ( w->color >> 16 & 0xff );
                        data [ 4 * i + 1 ] = ( w->color >>  8 & 0xff );
                        data [ 4 * i + 2 ] = ( w->color >>  0 & 0xff );
                        i++;
                }
        }

        if ( w->textureid > 0 ) glDeleteTextures ( 1, &w->textureid );

        glGenTextures ( 1, &w->textureid );
        glBindTexture ( GL_TEXTURE_2D, w->textureid );
        glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA, w->width, w->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );

#if 0
        glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
        glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
#endif
        glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
        glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

        free ( data );

        word_set_size ( w, w->width, w->height );
}

для каждой буквы создаётся своя текстура и свои вершины и текстуры с нужными размерами.
а потом это всё выводиться в буфер или на экран как правильно?
Код

void Font::draw ( ) {
        glUseProgram ( this->program );

        glActiveTexture ( GL_TEXTURE0 );
        glEnableVertexAttribArray ( 0 );
        glEnableVertexAttribArray ( 1 );
        for ( int i = 0; i < this->size_of_word; i++ ) {
                struct word *w = &this->word[i];
                glBindTexture ( GL_TEXTURE_2D, w->textureid );
                glUniform1i ( this->sampler_location, 0 );

                glUniformMatrix4fv ( this->transform_location, 1, GL_FALSE, &w->translate[0][0] );
                glUniformMatrix4fv ( this->proj_location, 1, GL_FALSE, &this->proj[0][0] );

                glVertexAttribPointer ( 0, 2, GL_FLOAT, GL_FALSE, 0, w->vertex );
                glVertexAttribPointer ( 1, 2, GL_FLOAT, GL_FALSE, 0, w->texture );

                glDrawArrays ( GL_TRIANGLES, 0, 12 );
        }
        glDisableVertexAttribArray ( 0 );
        glDisableVertexAttribArray ( 1 );
}


мозги << знания << опыт << старания
afqДата: Понедельник, 06 Января 2020, 06:50 | Сообщение # 98 | Тема: Несколько вопросов по float
Разработчик
Сейчас нет на сайте
alexsilent, используй тип unsigned long, он же есть такой в твоем языке?

мозги << знания << опыт << старания
afqДата: Понедельник, 06 Января 2020, 06:42 | Сообщение # 99 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
drcrack, спасибо.

мозги << знания << опыт << старания
afqДата: Понедельник, 06 Января 2020, 04:08 | Сообщение # 100 | Тема: какой то глюк в opengl чтоли.
Разработчик
Сейчас нет на сайте
никто не знает что это такое. линии где кнопки. они того же цвета что и шрифт. но код вроде нормальный.


мозги << знания << опыт << старания
Форум игроделов » Записи участника » afq [624]
Поиск:

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