какой то глюк в opengl чтоли.
| |
afq | Дата: Среда, 08 Января 2020, 11:10 | Сообщение # 21 |
Разработчик
Сейчас нет на сайте
| drcrack, ну фиг знает. я с играми долго не связывался потому что контента не было. а щас вроде начал рисовать и появилась возможность делать игру.
|
|
| |
afq | Дата: Среда, 08 Января 2020, 11:10 | Сообщение # 22 |
Разработчик
Сейчас нет на сайте
| Xakep, спасибо.
|
|
| |
drcrack | Дата: Среда, 08 Января 2020, 12:13 | Сообщение # 23 |
старожил
Сейчас нет на сайте
| Цитата Но может человеку интересно именно свой движок написать, понять как это работает, тогда нет никаких проблем, можно многому научиться. что интересно, я сотню раз слышал о такой мотивации, при этом людей, которые действительно поняли как оно работает, встречал единицы намного чаще самопальные движки просто забрасываются на этапе когда разработка становится слишком сложной для новичка
Сообщение отредактировал 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 постигать, только я знаю - это сложно.
|
|
| |
|