Здравствуйте.
При применении матриц трансформации на куб происходит такое искажение
В чём проблема?
Вот код:
#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; }
Natatem00
> В чём проблема?
в прокладке между стулом и клавиатурой
Misanthrope
> в прокладке между стулом и клавиатурой
Спасибо, весьма интеллектуальная помощь
Natatem00
Да брось ты это неблагодарное дело :) это только начало, там ещё хлеще проблемы полезут и с большей половиной тебя тут точно будут посылать, так как все их решают сами )))
Тоесть ты даже шейдера не запостил, где самое мясо? Может просто скопируешь и разберешь туторы из интернета? Типа learnopengl? Ты понимаешь, что дальше (после текстур) тебя ждет боль и страдания еще большие? тут дело не в том, что всем сложно тебе помочь. Это такое начало, что дальше хуже в 100 раз будет.
Да, нужны шейдеры, и чему аспект равен?
lookid
> Это такое начало, что дальше хуже в 100 раз будет.
Я знаю. Уже работал и с буферами, и с мат.формулами. Но я OpenGL трогал год назад и забыл самое банальное
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); }
Вьюпорт с размерами экрана попробуй поставить может поможет. И проверь aspect ratio вдруг у тебя целочисленное деление
IBets
> Вьюпорт с размерами экрана попробуй поставить может поможет
Спасибо, действиетльно помогло. Только странно: почему? Я всегда использовал FramebufferSize и такого никогда не было
Natatem00
Я в GL совсем не шарю. Ну по виду искаженного изображения предположил, что проблема во ViewPort, если aspect ratio выставлен верно
Natatem00
> Я всегда использовал FramebufferSize и такого никогда не было
>
>
Поменял обратно на FramebufferSize и всё продолжило корректно работать...
убогое апи
maks242
DX в таком случае даунскейлит фреймбуффер до реального разрешения окна и получаем альясинг не хуже LineTo.