Войти
ПрограммированиеФорумГрафика

Народ,с чего стоит начать практику после изучения OpenGL и GLSL? (8 стр)

Страницы: 13 4 5 6 7 8
#105
22:00, 13 янв. 2022

melvy
Тогда след вопрос.Почему модель рукожопо рендерит?

#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <map>
#include <glew.h>
#include <GL/glut.h>
#include <regex>
using namespace std;

struct Vertex
{
    GLfloat x, y, z;
};

struct Face
{
    GLuint vertid1, vertid2, vertid3;
};

struct Model
{
    vector<Vertex> vertices;
    vector<Face> faces;
};

vector<string> split(string s, string delimiter) {
    size_t         pos_start = 0, pos_end, delim_len = delimiter.length();
    string         token;
    vector<string> res;

    while ((pos_end = s.find(delimiter, pos_start)) != string::npos) {
        token = s.substr(pos_start, pos_end - pos_start);
        pos_start = pos_end + delim_len;
        res.push_back(token);
    }
    res.push_back(s.substr(pos_start));
    return res;
}

Model parseOBJ(string fn)
{
  ifstream in(fn);
  string str;
    vector<string> vec,vec1;
    Model model;
    Vertex vertex;
    Face face;
  while (getline(in, str))
  {
        vec = split(str, " ");
        if (vec[0] == "v")
        {
            vertex.x = stof(vec[1].c_str());
            vertex.y = stof(vec[2].c_str());
            vertex.z = stof(vec[3].c_str());
            model.vertices.push_back(vertex);
        }
        else if (str[0] == 'f')
        {
            vec1 = split(vec[1], "/");
            face.vertid1 = atoi(vec1[0].c_str());
            vec1 = split(vec[2], "/");
            face.vertid2 = atoi(vec1[0].c_str());
            vec1 = split(vec[3], "/");
            face.vertid3 = atoi(vec1[0].c_str());
            model.faces.push_back(face);
          //  vec1 = split(vec[4], "/");
           // model.indices.push_back(atoi(vec1[0].c_str()));
          //  model.normals_indices.push_back(atoi(vec1[2].c_str()));
        }
  }
    in.close();
    return model;
}

GLfloat* vertexs;
GLuint* indices;
GLfloat* normals;
GLfloat* texcoords;
GLfloat* all_normals;
GLfloat* all_vertexs;

Model model;

void init()
{
    static int i = 0;
    if (i == 0)
        model = parseOBJ("block.obj");
    i++;
    glClearColor(0.0, 0.0, 0.0, 1.0); //фоновый цвет
    glShadeModel(GL_SMOOTH); //плавная модель заливки
    GLfloat pos[] = {10.0,1.0,10.0 };
    GLfloat ambientMaterial[] = { 0.85,0.43,0.57 };
    GLfloat ambientLigt[] = { 1.0,0.0,0.0 };
   // GLfloat shininess[] = { 80.0 };
    GLfloat diffuseMaterial[] = { 1.0,0.0,1.0 };
    GLfloat diffuseLight[] = { 1.0,0.0,1.0 };
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambientMaterial);
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLigt);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
  //  glLightfv(GL_LIGHT0, GL_SHININESS, shininess);
    glEnable(GL_LIGHTING); //активация освещения
    glEnable(GL_NORMALIZE);
    glEnable(GL_DEPTH_TEST); //активация теста нулбины
    glEnable(GL_LIGHT0); //активация источника света
}


GLfloat camPos[] = { 0.0,0.0,0.0 };
GLfloat lookAt[] = { 0.0,0.0,0.0 };
GLfloat up[] = { 0.0,1.0,0.0 };

GLfloat angle = 0.0;

void draw()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
   // glRotatef(60.0, 1.0, 0.0, 0.0);
    gluLookAt(0.0,0.0,0.0,0.0,0.0,-1.0, up[0], up[1], up[2]);
    glColor3f(500.0, 500.0, 500.0);
    //glScalef(1000.0,1000.0,10000.0);
    //glTranslatef(1.0, 1.0, 3.0);
  //  glEnableClientState(GL_NORMAL_ARRAY);
   // glNormalPointer(GL_FLOAT, 0, all_normals);
   // glDrawElements(GL_TRIANGLES, model.indices.size(), GL_UNSIGNED_INT, indices);
    //glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  //  glRotatef(angle, 1.0, 0.0, 0.0); //поворот по оси x
    glBegin(GL_TRIANGLES);
    for (int i = 0; i < model.faces.size(); ++i)
    {
        auto v1 = model.vertices[model.faces[i].vertid1];
        auto v2 = model.vertices[model.faces[i].vertid2];
        auto v3 = model.vertices[model.faces[i].vertid3];
        glVertex3f(v1.x,v1.y,v1.z);
        glVertex3f(v2.x, v2.y, v2.z);
        glVertex3f(v3.x, v3.y, v3.z);
    }
    glEnd();
   // glDrawArrays(GL_TRIANGLES, 0, 36);
    glFlush();
   
}

void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-100.0, 100.0, -100.0, 100.0, -10.0, 10.0);
}

void keyboard(uint8_t k, int x, int y)
{
    if (k == '1')
        angle += 10.0;
    if (angle >= 360.0)
        angle = 0.0;
    glutPostRedisplay();
}

int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowSize(1024, 768);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Демо-сцена на OpenGL");
    init();
    glutDisplayFunc(draw);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
}

#106
0:23, 14 янв. 2022

EnderGames
почему ты мне пишешь я без понятия

(если думаешь что типо "тестишь меня" то нет мне плевать на тебя и твой код, у меня свои рабочие рендеры где все работает, и тоько потому что "я типо разбираюсь" я не буду твой код читать и искать подводные камни которые ты типо спрятал чтоб потестить меня (типо ты такой умный ага чел), и если ты не можешь нагуглить веб сайт https://learnopengl.com/ то это твои проблемы)

#107
2:46, 14 янв. 2022

melvy
Потому что не нужно отвечать на сообщения и общаться с совсем зелеными. Демка с пбр кубом и камерой-аркболом это 1к строк кода в 1 файле. И никакого блокера тут нет. Если автор не может - пусть идёт учит кормера, еберли или ленгейла. Или демки с гитхаба качает.

#108
(Правка: 6:18) 6:16, 14 янв. 2022

lookid
да он на троля похож, типо "я такой умный а нука посмотрю какие вы тут тупые"
и начал с ГЛУТа когда ему уже четвертую страницу, не только я, говорят что этим никто не пользуется
с десяток разных вариантов назвали - и webgl и готовые движки... чел продолжает "тролить"...
(другие его посты не лучше и отвечаются первыми ссылками из гугла... не смешно и тригерит)

#109
(Правка: 15:45) 9:06, 14 янв. 2022

EnderGames
> Почему модель рукожопо рендерит?
потому что у тебя совсем нет понимания что и для чего ты это делаешь...
читай книжки или статьи, и начинай писать код уже осознанно...
А твой код, приведённый выше, не должен работать в принципе.

EnderGames
> glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

> glOrtho(-100.0, 100.0, -100.0, 100.0, -10.0, 10.0);
Ты пытаешься вывести 3D модель, почему проекция ортогональная? Должна быть перспективная.

EnderGames
> glColor3f(500.0, 500.0, 500.0);
цвет выводится в диапазоне [0, 1]

> Model parseOBJ(string fn)
Участок кода parserOBJ - даже разбираться не хочу, там вообще белиберда.
Хочешь свой велосипед написать, ОК - вперёд!
Но для формата .obj уже есть хорошо написанные парсеры, например:
https://github.com/tinyobjloader/tinyobjloader
смотри, изучай примеры

#110
9:21, 14 янв. 2022

std::variant
есть.Насчёт цвета,то я случайно пихнул туда,хотел поместить 500.0,500.0,500.0 в glScalef.И цвета находятся ещё в диапазоне от 0 до 255,если это glColor3i.Примеры я видел,тоже не очень работают.Я и перспективную проекцию использовал,и всё равно эффекта никакого.И проблему я нашел уже - порядок вершин,хотя может здесь я и ошибаюсь тоже.

#111
19:45, 14 янв. 2022

std::variant
Проблему решил.Так же решил по идеи проблему с камерой,что у меня была.

Страницы: 13 4 5 6 7 8
ПрограммированиеФорумГрафика