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

Проблема с перспективой OpenGL

#0
14:46, 7 июня 2019

Здравствуйте.
При применении матриц трансформации на куб происходит такое искажение OpenGL искажение | Проблема с перспективой OpenGL
В чём проблема?

Вот код:

#define GLEW_STATIC
#include "PCH.h"
#include "Window\Window.h"
#include "Shader\Shader.h"
#include "Mesh\Mesh.h"
#include "glm\gtc\matrix_transform.hpp"
#include "glm\gtc\type_ptr.hpp"
const char* vertexShader = "Shaders\\core.vs";

const char* fragmentShader = "Shaders\\core.frag";

int main()
{
  float vertices[] = 
  {
    -0.5f, -0.5f, -0.5f, 
    0.5f, -0.5f, -0.5f,  
    0.5f,  0.5f, -0.5f,  
    0.5f,  0.5f, -0.5f,  
    -0.5f,  0.5f, -0.5f, 
    -0.5f, -0.5f, -0.5f, 

    -0.5f, -0.5f,  0.5f, 
    0.5f, -0.5f,  0.5f,  
    0.5f,  0.5f,  0.5f,  
    0.5f,  0.5f,  0.5f,  
    -0.5f,  0.5f,  0.5f, 
    -0.5f, -0.5f,  0.5f, 

    -0.5f,  0.5f,  0.5f, 
    -0.5f,  0.5f, -0.5f, 
    -0.5f, -0.5f, -0.5f, 
    -0.5f, -0.5f, -0.5f, 
    -0.5f, -0.5f,  0.5f, 
    -0.5f,  0.5f,  0.5f, 

    0.5f,  0.5f,  0.5f,  
    0.5f,  0.5f, -0.5f,  
    0.5f, -0.5f, -0.5f,  
    0.5f, -0.5f, -0.5f,  
    0.5f, -0.5f,  0.5f,  
    0.5f,  0.5f,  0.5f,  

    -0.5f, -0.5f, -0.5f, 
    0.5f, -0.5f, -0.5f,  
    0.5f, -0.5f,  0.5f,  
    0.5f, -0.5f,  0.5f,  
    -0.5f, -0.5f,  0.5f, 
    -0.5f, -0.5f, -0.5f, 

    -0.5f,  0.5f, -0.5f, 
    0.5f,  0.5f, -0.5f,  
    0.5f,  0.5f,  0.5f,  
    0.5f,  0.5f,  0.5f,  
    -0.5f,  0.5f,  0.5f, 
    -0.5f,  0.5f, -0.5f 

  };
  Window window = Window({ 1280, 720, "First" });
  Mesh mesh(vertices);
  Shader standartShader(vertexShader, fragmentShader);
  float color[] = 
  { 
    0.5f, 0.5f, 0.5f,
    0.5f, 0.5f, 0.5f,
    0.5f, 0.5f, 0.5f,
    0.5f, 0.5f, 0.5f,
    0.5f, 0.5f, 0.5f,
    0.5f, 0.5f, 0.5f,

    0.5f, 0.5f,  0.5f,
    0.5f, 0.5f,  0.5f,
    0.5f, 0.5f,  0.5f,
    0.5f, 0.5f,  0.5f,
    0.5f, 0.5f,  0.5f,
    0.5f, 0.5f,  0.5f,

    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f, 0.5f,
    0.5f,  0.5f, 0.5f,
    0.5f,  0.5f, 0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,

    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,

    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,

    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f,
    0.5f,  0.5f,  0.5f

  };
  mesh.ColorMesh(color);
  glEnable(GL_DEPTH_TEST);
  auto aspect = window.GetAspect();
  auto projMat = glm::perspective(glm::radians(45.f), aspect, 0.1f, 1000.0f);
  while (true)
  {
    glClearColor(0.1, .1, 0.1, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    standartShader.UseShader();

    auto mvLoc = glGetUniformLocation(standartShader.GetShader(), "mv_matrix");
    auto projLoc = glGetUniformLocation(standartShader.GetShader(), "proj_matrix");
    auto viewMat = glm::mat4(1.f);
    auto mMat = glm::mat4(1.f);
    viewMat = glm::translate(viewMat, glm::vec3(0, .0f, -8));
    mMat = glm::translate(mMat, glm::vec3(0, -2.0f, 0));

    //mvMat = glm::rotate(mvMat, (float)glfwGetTime() * glm::radians(50.0f), glm::vec3(0.5f, 1.0f, 0.0f));

    auto mvMat = viewMat * mMat;

    glUniformMatrix4fv(mvLoc, 1, GL_FALSE, glm::value_ptr(mvMat));
    glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projMat));

    mesh.Draw(GL_TRIANGLES);
    window.Update();
    glUseProgram(0);
  }

  return EXIT_SUCCESS;
}


#1
14:49, 7 июня 2019

Natatem00
> В чём проблема?
в прокладке между стулом и клавиатурой

#2
14:58, 7 июня 2019

Misanthrope
> в прокладке между стулом и клавиатурой
Спасибо, весьма интеллектуальная помощь

#3
15:09, 7 июня 2019

Natatem00
Да брось ты это неблагодарное дело :) это только начало, там ещё хлеще проблемы полезут и с большей половиной тебя тут точно будут посылать, так как все их решают сами )))

#4
15:43, 7 июня 2019

Тоесть ты даже шейдера не запостил, где самое мясо? Может просто скопируешь и разберешь туторы из интернета? Типа learnopengl? Ты понимаешь, что дальше (после текстур) тебя ждет боль и страдания еще большие? тут дело не в том, что всем сложно тебе помочь. Это такое начало, что дальше хуже в 100 раз будет.

#5
15:45, 7 июня 2019

Да, нужны шейдеры, и чему аспект равен?

#6
15:59, 7 июня 2019

lookid
> Это такое начало, что дальше хуже в 100 раз будет.
Я знаю. Уже работал и с буферами, и с мат.формулами. Но я OpenGL трогал год назад и забыл самое банальное

#7
16:01, 7 июня 2019

Dimich
> Да, нужны шейдеры, и чему аспект равен?
Аспект = screenWidth / screenHeight = 1280 / 720 = 1.7777

Шейдеры простые:

#version 330      

layout(location = 0) in vec3 pos;
layout(location = 1) in vec3 color;

out vec3 ourColor;

uniform mat4 mv_matrix;
uniform mat4 proj_matrix;

void main()               
{                     
  gl_Position = proj_matrix * mv_matrix * vec4(pos,1);
  ourColor = color;
}  
#version 330               
                                      
out vec4 color;             
in vec3 ourColor;

void main()              
{                     
  color = vec4(ourColor, 1.0); 
}  
#8
(Правка: 16:21) 16:20, 7 июня 2019

Вьюпорт с размерами экрана попробуй поставить может поможет. И проверь aspect ratio вдруг у тебя целочисленное деление

#9
16:37, 7 июня 2019


IBets
> Вьюпорт с размерами экрана попробуй поставить может поможет
Спасибо, действиетльно помогло. Только странно: почему? Я всегда использовал FramebufferSize и такого никогда не было

#10
(Правка: 16:40) 16:40, 7 июня 2019

Natatem00
Я в GL совсем не шарю. Ну по виду искаженного изображения предположил, что проблема во ViewPort, если aspect ratio выставлен верно

#11
16:40, 7 июня 2019


Natatem00
> Я всегда использовал FramebufferSize и такого никогда не было
>
>
Поменял обратно на FramebufferSize и всё продолжило корректно работать...

#12
2:34, 8 июня 2019

убогое апи

#13
9:39, 12 июня 2019

maks242
DX в таком случае даунскейлит фреймбуффер до реального разрешения окна и получаем альясинг не хуже LineTo.

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