模型,视图和投影矩阵不希望对opengl glsl有效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模型,视图和投影矩阵不希望对opengl glsl有效相关的知识,希望对你有一定的参考价值。

我正在尝试使用opengl创建我的第一个多维数据集。不幸的是我陷入了轻松轮换。它应该是这样的:

相反,我得到那些奇怪的,甚至不知道如何称呼它:https://youtu.be/0A5Hi-8bygE

顶点着色器

#version 330 core

layout (location = 0) in vec2 a_position;
layout (location = 1) in vec2 a_uv;
layout (location = 2) in vec4 a_color;

out vec2 v_fragmentPosition;
out vec2 v_fragmentUV;
out vec4 v_fragmentColor;

uniform mat4 u_model;
uniform mat4 u_view;
uniform mat4 u_projection;

void main()
{
    gl_Position = u_projection * u_view * u_model * vec4(a_position, 0.0, 1.0);

    v_fragmentPosition = a_position;
    v_fragmentUV = vec2(a_uv.x, 1 - a_uv.y);
    v_fragmentColor = a_color;
}

分段

#version 330 core

out vec4 outColor;

in vec2 v_fragmentPosition;
in vec2 v_fragmentUV;
in vec4 v_fragmentColor;

void main()
{
    outColor = v_fragmentColor;
}

主要

#include <glad.h>

#include <glm.hpp>
#include <gtc/matrix_transform.hpp>
#include <gtc/type_ptr.hpp>
#include <iostream>

#include "Mesh.h"
#include "Shader.h"

int main(int argc,char*args[])
{
    SDL_Init(SDL_INIT_EVERYTHING);

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 4);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

    SDL_Window* window = SDL_CreateWindow("fdas", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL);
    SDL_GLContext context = SDL_GL_CreateContext(window);

    gladLoadGLLoader(SDL_GL_GetProcAddress);

    glEnable(GL_DEPTH_TEST);

    Shader shader;

    std::string vertex = shader.LoadFromFile("vertex.shader");
    std::string fragment = shader.LoadFromFile("fragment.shader");
    shader.CreateShaderProgram(vertex.c_str(), fragment.c_str());
    shader.useProgram();

    Mesh mesh;
    mesh.CreateVertexArray();

    bool quit = false;
    SDL_Event event;
    while (!quit)
    {
        while (SDL_PollEvent(&event))
        {
            if (event.type == SDL_QUIT)
            {
            exit(0);
                }
        }
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glm::mat4 model;
        model = glm::rotate(model, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f));

        glm::mat4 view;
        view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));

        glm::mat4 projection;
        projection = glm::perspective(glm::radians(45.0f), 1280 / 720.0f, 0.1f, 100.0f);

        GLint u_model = shader.GetUniformLocation("u_model");
        GLint u_view = shader.GetUniformLocation("u_view");
        GLint u_projection = shader.GetUniformLocation("u_projection");

        glUniformMatrix4fv(u_model, 1, GL_FALSE, glm::value_ptr(model));
        glUniformMatrix4fv(u_view, 1, GL_FALSE, glm::value_ptr(view));
        glUniformMatrix4fv(u_projection, 1, GL_FALSE, glm::value_ptr(projection));

        Rect destRect = { -0.5f, -0.5f, 1.0f, 1.0f };   
        Rect uvRect = { 0.0f, 0.0f, 1.0f, 1.0f };
        ColorRGBA color = { 255, 255, 128, 255 };

        mesh.CreateQuad(destRect, uvRect, color);
        mesh.Draw(0);

        SDL_GL_SwapWindow(window);
    }
    return 0;
}

啮合

void Mesh::CreateVertexArray()
{
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);

    glGenBuffers(1, &ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);

    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, uv));
    glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), (void*)offsetof(Vertex, color));

    glBindVertexArray(0);
}

void Mesh::CreateQuad(Rect destRect, Rect uvRect, ColorRGBA color)
{
    vertex[0].color = color; // topleft
    vertex[0].setPosition(destRect.x, destRect.y + destRect.h);
    vertex[0].setUV(uvRect.x, uvRect.y + uvRect.h);

    vertex[1].color = color;
    vertex[1].setPosition(destRect.x, destRect.y); // bottom left
    vertex[1].setUV(uvRect.x, uvRect.y);

    vertex[2].color = color;
    vertex[2].setPosition(destRect.x + destRect.w, destRect.y); // bottom right
    vertex[2].setUV(uvRect.x + uvRect.w, uvRect.y);

    vertex[3].color = color;
    vertex[3].setPosition(destRect.x + destRect.w, destRect.y + destRect.h); // top right
    vertex[3].setUV(uvRect.x + uvRect.w, uvRect.y + uvRect.h);

    GLuint indices[6] = {
        0, 1, 2,
        2, 3, 0
    };

    glBindVertexArray(vao);

    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(vertex), NULL, GL_STATIC_DRAW); // orphan the buffer
    glBufferSubData(GL_ARRAY_BUFFER, 0, 6 * sizeof(vertex), vertex);

    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(GLuint), NULL, GL_STATIC_DRAW); // orphan the buffer
    glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, 6 * sizeof(GLuint), indices);

    glBindVertexArray(0);

}

void Mesh::Draw(GLuint texture)
{
    glBindVertexArray(vao);

  //  glEnable(GL_CULL_FACE);
   // glCullFace(GL_FRONT);
    //glFrontFace(GL_CW);

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL);

    glBindVertexArray(0);
}

顶点

struct Rect {
    float x, y;
    float w, h;
};
struct Position {
    float x, y;
};

struct UV {
    float u, v;
};

struct ColorRGBA {
    GLubyte r, g, b, a;
};
class Vertex
{
public:
    Vertex();
    ~Vertex();

    void setPosition(float x, float y);
    void setcolor(ColorRGBA color);
    void setUV(float u, float v);

    UV uv;
    ColorRGBA color;
    Position position;
};

我不会展示着色器类,因为它对它有好处。

我知道,因为我做了一个实验。

我在片段类中创建了一个名为u_expColor的新制服,并设置了outColor = u_expColor并更改了四边形的颜色。

我还在顶点着色器中创建了统一的vec4 u_expPos,并且说gl_Position = e_expPos并且它创建了四元组而没有任何问题。

只有当我想在顶点着色器中通过mvp创建/乘以位置时才会出现类似管视频的问题。

怎么解决?

答案

我已经修好了感谢http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/#putting-it-all-together。我看到他了

glm::mat4 model = glm::mat4(1.0f) 

这就是我必须做的一切。

以上是关于模型,视图和投影矩阵不希望对opengl glsl有效的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL GLSL - 投影矩阵不起作用

如何使用 OpenGL 正确投影和扭曲 3d 点

如何在opengl中计算给定3D点及其2D屏幕位置的投影/模型视图矩阵

OpenGL:光照模型视图投影变换

OpenGL 3.2 设置矩阵的麻烦

GLSL:如何使用投影矩阵计算光线方向?