Проблема с файлом .obj рендеринга OpenGl

Я пытаюсь загрузить файл .obj с помощью созданного мной загрузчика файлов .obj, и, похоже, он работает правильно (с точки зрения загрузки).

При этом, когда я рисую 3D-объект на экране, он создает большой красный квадрат.

GLenum err = glewInit();
if (err != GLEW_OK)
{
    std::cout << "NOT WORKING" << std::endl;
}
const char* vertexShaderSource = "#version 330\n\
    in vec4 position;\
    void main(void) {\
        gl_Position = position;\
    }";

// compile fragment shader source
const GLchar* fragmentShaderSource = "#version 330\n\
    out vec4 fragColor;\
    void main(void) {\
        fragColor = vec4(1.0,0.3,0.3,0.15);\
    }";

/* Creating Shader */
this->programId = glCreateProgram();
this->vId = glCreateShader(GL_VERTEX_SHADER);
this->fId = glCreateShader(GL_FRAGMENT_SHADER);

/* Get Shader Size */
int vertexShaderLength = strlen(vertexShaderSource);
int fragmentShaderLength = strlen(fragmentShaderSource);

/* Loading and binding shader */
glShaderSource(this->vId, 1, &vertexShaderSource, NULL);
glShaderSource(this->fId, 1, &fragmentShaderSource, NULL);

/* Compile Shaders */
glCompileShader(vId);
int iIsOk = 0;
glGetShaderiv(this->vId, GL_COMPILE_STATUS, &iIsOk);
if (!iIsOk)
{
    return;
}
int iIsOk2;
glCompileShader(fId);
glGetShaderiv(this->fId, GL_COMPILE_STATUS, &iIsOk2);
if (!iIsOk2)
{
    std::cout << "U SUCK!" << std::endl;
    std::cout << glGetError() << std::endl;
}

/* Attach Shaders */
glAttachShader(this->programId, this->vId);
glAttachShader(this->programId, this->fId);

/* Bind Attributes from Shader */
glBindAttribLocation(this->programId, 0, "position");
glBindFragDataLocation(this->programId, 0, "fragcolor");

/* Link gprogram */
glLinkProgram(this->programId);

/* Use and bind attribute */
glUseProgram(this->programId);
this->positionId = glGetAttribLocation(this->programId, "position");
glUseProgram(0);

/* VAO Time */
glGenVertexArrays(1, &this->vaoId);
glBindVertexArray(this->vaoId);

/* VBO Time assigning to VAO */
glGenBuffers(1, &this->vboId);
glBindBuffer(GL_ARRAY_BUFFER, this->vboId);
glBufferData(GL_ARRAY_BUFFER, vertcies.size() * sizeof(sf::Vector3f), &vertcies[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(this->positionId);
glVertexAttribPointer(this->positionId, 3, GL_FLOAT, GL_FALSE, sizeof(sf::Vector3f), 0);

/* Close out bindings */
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);

РИСОВАТЬ:

glUseProgram(this->programId);
glBindVertexArray(this->vaoId);
glDrawArrays(GL_TRIANGLES, 0, this->vertcies.size());
glBindVertexArray(0);
glUseProgram(0);

Я загрузил изображение того, что отображалось в красном поле.

Мне любопытно, я что-то упустил в коде openGL или что я делаю неправильно?

Я могу правильно отображать треугольник, но когда я загружаю свои файлы .obj, это то, что я отображаю.

Выше приведен весь код openGL, который у меня есть в проекте, есть ли в моем коде простая ошибка... или что-то забыл?

Результат снимка экрана


person user5600884    schedule 04.01.2016    source источник
comment
Почему вы указываете 2 компонента для позиций в вызове glVertexAttribPointer()? Разве вы не используете 3D-координаты?   -  person Reto Koradi    schedule 04.01.2016
comment
@Reto Koradi Я думаю, я очень запутался в том, как работает вся сделка. Я изменил это на 3, но по-прежнему получаю ту же проблему, однако я обновил код, чтобы показать вам точное изменение, которое я сделал.   -  person user5600884    schedule 04.01.2016
comment
Матрица представления не определена, а затенение представляет собой плоский цвет. Какой результат вы ожидаете увидеть? Кроме того, вы уверены, что ваши вершины расположены правильно для рендеринга без определения элементов? Я рекомендую начать с подробного руководства по opengl, например. open.gl   -  person Rotem    schedule 04.01.2016


Ответы (1)


Вам нужно использовать матрицу модели и матрицу представления...

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

Я предполагаю, что координаты вершин вашего объекта выходят за пределы 0 или 1. Вот почему вы не можете просмотреть его полностью.

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

Даже если ваш объект — куб, вы все равно увидите четырехугольник. Так что либо используйте освещение или текстуру, либо попробуйте изменить цвет каждой вершины.

Надеюсь, поможет.

person Amine Bensalem    schedule 08.11.2016