Четверг, 18 Апреля 2024, 06:21

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Форум игроделов » Программирование » C/C++ » какой то глюк в opengl чтоли.
какой то глюк в opengl чтоли.
afqДата: Среда, 08 Января 2020, 11:10 | Сообщение # 21
Разработчик
Сейчас нет на сайте
drcrack, ну фиг знает. я с играми долго не связывался потому что контента не было. а щас вроде начал рисовать и появилась возможность делать игру.
afqДата: Среда, 08 Января 2020, 11:10 | Сообщение # 22
Разработчик
Сейчас нет на сайте
Xakep, спасибо.
drcrackДата: Среда, 08 Января 2020, 12:13 | Сообщение # 23
старожил
Сейчас нет на сайте
Цитата
Но может человеку интересно именно свой движок написать, понять как это работает, тогда нет никаких проблем, можно многому научиться.

что интересно, я сотню раз слышал о такой мотивации, при этом людей, которые действительно поняли как оно работает, встречал единицы
намного чаще самопальные движки просто забрасываются на этапе когда разработка становится слишком сложной для новичка :D


Сообщение отредактировал drcrack - Среда, 08 Января 2020, 12:13
afqДата: Среда, 08 Января 2020, 23:53 | Сообщение # 24
Разработчик
Сейчас нет на сайте
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 );
}
XakepДата: Пятница, 10 Января 2020, 05:59 | Сообщение # 25
めちゃくちゃちゃ
Сейчас нет на сайте
Я не знаю, мне лень выполнять роль компилятора и я не знаю как формат obj устроен. Но как минимум ты делаешь опять ту же ошибку, что и в предыдущем примере - `length_v` нужно делить на 3 в `glDrawArrays`, т.к. у тебя 3 компонента на вершину. И почему бы не использовать assimp для загрузки моделей?

Сообщение отредактировал Xakep - Пятница, 10 Января 2020, 05:59
afqДата: Пятница, 10 Января 2020, 18:13 | Сообщение # 26
Разработчик
Сейчас нет на сайте
Xakep,
Цитата
Но как минимум ты делаешь опять ту же ошибку, что и в предыдущем примере - `length_v` нужно делить на 3 в `glDrawArrays`, т.к. у тебя 3 компонента на вершину.
ну я не понимаю. а сколько тогда надо рисовать. если у меня допустим 6 компонентов?
afqДата: Пятница, 10 Января 2020, 18:19 | Сообщение # 27
Разработчик
Сейчас нет на сайте
а понятно. для треугольника нужно 9 компонент. тогда надо делать на 9.
XakepДата: Суббота, 11 Января 2020, 15:15 | Сообщение # 28
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата afq ()
а понятно. для треугольника нужно 9 компонент. тогда надо делать на 9.

почему на 9? на 3

Я еще не заметил, что ты уже разделил на 3 количество вершин в `read_file`, не самое удачное название переменной - `current_length`. И вообще, почему-бы просто не использовать массив из векторов (glm::vec2/glm::vec3 итд), вместо того, чтобы делать линейный массив из флоатов?
afqДата: Суббота, 11 Января 2020, 16:07 | Сообщение # 29
Разработчик
Сейчас нет на сайте
Xakep, ну я подумал что на 9 это значит, что три компоненты, это одна точка в пространстве, 6 компонент, это две точки в пространстве. 9 компонент, это три точки в пространстве, а значит треугольник. Ну насчет glm::vec3 не знаю. Так как то удобней код организовать. указал размер массива, чтобы считать и считал в массив float и всё.
XakepДата: Суббота, 11 Января 2020, 18:14 | Сообщение # 30
めちゃくちゃちゃ
Сейчас нет на сайте
если у тебя массив из 9ти флоатов, то делим на 3 - получаем три вершины. glDrawArrays воспринимает количество вершин, через glVertexAttribPointer - ты указываешь размер вершин, в твоем примере - это 3 флоата, следовательно на одну вершину должно приходиться 3 * sizeof(float) байт, т.к. у тебя вершины хранятся в линейном массиве из флоатов, чтобы получить количество вершин, ты должен поделить количество элементов в массиве на 3.
afqДата: Суббота, 11 Января 2020, 19:24 | Сообщение # 31
Разработчик
Сейчас нет на сайте
Xakep, а, ясно. все равно рисуется почему то один треугольник. а в каких то случаях рисовалось почти пол квадрата с разными цветами.
afqДата: Пятница, 17 Января 2020, 11:53 | Сообщение # 32
Разработчик
Сейчас нет на сайте
Ура товарищи, я догадался в чём проблема была, почему не рисовался куб в 3d. Очередной раз просматривал код. Напомню, у меня рисовался один треугольник вместо куба. Рисовал я куб без текстуры, только цветом. Вот в этом то и была проблема.
Я задавал цвет с помощью такой функции.
Код

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

этот вектор, это массив из четырёх компонентов. И моя ошибка была в том, что я писал там где вершины.
Код

        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] );

И я совсем не подумал что из этого массива будет постепенно считываться по 4 компонента. то есть сначала вершины считываются 0 - 3, потом 4 - 7, а цвету то я всего 4 компонента задал. И из-за этого дальше считывались нули у m->color, потому что размер массива был всего четыре float. Я поменял этот color на uniform переменную. и теперь в отрисовке это выглядит так.
Код

glUniform4fv ( m->wiot.color_location, 1, &m->color[0] );

И всё, теперь куб рисуется без проблем. Теперь можно и 3d постигать, только я знаю - это сложно.
Форум игроделов » Программирование » C/C++ » какой то глюк в opengl чтоли.
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

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