无法获得与我的图像一起使用的透视图

科普堂

所以我正在关注相机的 LearnOpenGL 教程。我正在尝试渲染一个立方体(用顶点向量定义)并围绕立方体圈起来以确保它已正确渲染。我可以很好地渲染立方体的正面,但是一旦我将着色器切换为使用 MVP,就没有任何渲染

void GraphicsProgram::run_program() 
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    state = RUNNING;

    // TODO: Move these into their respective classes
    // Hardcoded for some testing
    // ----------------------------------------------
    const char *vertexShaderPath = "vertex_shader.vs";
    const char *fragmentShaderPath = "fragment_shader.fs";
    Shader firstShader = Shader(vertexShaderPath, fragmentShaderPath);

    std::vector<Vertex> verts;
    Vertex v1, v2, v3, v4, v5, v6, v7, v8;
    v1.position = { -0.5, -0.5, +0.5 };
    v2.position = { +0.5, -0.5, +0.5 };
    v3.position = { +0.5, +0.5, +0.5 };
    v4.position = { -0.5, +0.5, +0.5 };
    v5.position = { +0.5, -0.5, -0.5 };
    v6.position = { +0.5, +0.5, -0.5 };
    v7.position = { -0.5, +0.5, -0.5 };
    v8.position = { -0.5, -0.5, -0.5 };

    verts.push_back(v1);
    verts.push_back(v2);
    verts.push_back(v3);
    verts.push_back(v4);
    verts.push_back(v5);
    verts.push_back(v6);
    verts.push_back(v7);
    verts.push_back(v8);

    std::vector<unsigned int> indicies = { 
        0, 1, 2, 0, 2, 3, // front
        1, 4, 5, 1, 5, 2, // right
        4, 7, 6, 4, 6, 7, // back
        7, 0, 3, 7, 3, 6, // left
        3, 2, 5, 3, 5, 6, // top
        7, 4, 1, 7, 1, 0  // bottom
    };


    unsigned int VBO, VAO, EBO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glGenBuffers(1, &EBO);

    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, verts.size() * sizeof(Vertex), &verts[0], GL_STATIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicies.size() * sizeof(unsigned int), &indicies[0], GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glBindVertexArray(0);


    glUseProgram(firstShader.shaderID);

    glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
    firstShader.set_mat4("projection", projection);

    while (state == RUNNING) {
        currentFrame = (float)SDL_GetTicks() / 1000;
        deltaTime = lastFrame - currentFrame;
        lastFrame = currentFrame;

        process_input();

        glUseProgram(firstShader.shaderID);

        glm::mat4 view;
        float radius = 10.0f;
        float camX = sin((float)SDL_GetTicks() / 1000) * radius;
        float camZ = cos((float)SDL_GetTicks() / 1000) * radius;
        view = glm::lookAt(glm::vec3(camX, 0.0f, camZ), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
        firstShader.set_mat4("view", view);

        glBindVertexArray(VAO);

        glm::mat4 model;
        model = glm::translate(model, glm::vec3(0.0, 0.0, 0.0));
        float angle = 0.0;
        model = glm::rotate(model, glm::radians(angle), glm::vec3(0,0,0));
        firstShader.set_mat4("model", model);

        glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_INT, 0);
        SDL_GL_SwapWindow(window);
    }

    shutdown_program();
}

顶点结构:

struct Vertex {
    glm::vec3 position;
    glm::vec3 normal;
    glm::vec2 texCoord;
};

顶点着色器代码:

#version 330 core
layout (location = 0) in vec3 aPos;

out vec4 vertexColor;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main() {
    gl_Position = projection * view * model * vec4(aPos, 1.0f);
    vertexColor = vec4(abs(aPos.x), abs(aPos.y), abs(aPos.z), 1.0);
}

片段着色器:

#version 330 core

in vec4 vertexColor;
out vec4 fragColor;

void main() {
    fragColor = vertexColor;
}

我最初使用的顶点着色器只是接收顶点位置。

疯兔76

您必须初始化矩阵变量glm::mat4 modelglm::mat4 view

GLM API文档是指OpenGL着色语言规范4.20

5.4.2 向量和矩阵构造函数

如果向量构造函数只有一个标量参数,则它用于将构造向量的所有组件初始化为该标量的值。如果矩阵构造函数只有一个标量参数,则它用于初始化矩阵对角线上的所有分量,其余分量初始化为 0.0。

这意味着,可以通过单个参数 1.0 初始化单位矩阵:

glm::mat4 model(1.0f);

....

glm::mat4 view(1.0f);

您错过了在 中设置适当的旋转轴glm::rotate

model = glm::rotate(model, glm::radians(angle), 
    glm::vec3(1.0,0,0)); // e.g. (1, 0, 0) instead of (0, 0, 0)

您必须在每一帧 ( glClear)之前清除默认的 farmebuffer

glClearColor(0.0, 0.0, 0.0, 1.0);

while (state == RUNNING)
{
    glClear(GL_COLOR_BUFFER_BIT);

    .....

您应该启用深度测试并清除深度缓冲区:

glEnable(GL_DEPTH_TEST);
glClearColor(0.0, 0.0, 0.0, 1.0);

while (state == RUNNING)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    .....

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法获得与 Swift 一起使用的触觉反馈

HTML按钮无法与我的JavaScript一起使用

serialize()无法与我的表单一起使用

无法使SaveFileDialog与我的网页一起使用

ImageIcon无法与我一起使用

$ rootScope在AngularJs中无法与我一起使用

查找4个特定的角像素并将其与翘曲透视图一起使用

无法获得与log4j2一起使用的RollingFile

Java-无法获得与硒一起使用的最新Edge / Chromium版本

使用:after或:: after的Clearfix无法与我的彩色框一起使用

透视图像拼接

无法在Razor视图中将我的Int ObjectId与我的Byte []时间戳连接在一起

我如何获得与gnome-terminal,tmux和vim一起使用的日晒色彩方案?

我如何获得与Firebase的身份验证才能与Angular2 FINAL一起使用?

无法让 VSCode 调试与我的 NodeJs 应用程序一起使用

为什么join(“,”)无法与我的数组一起使用?

Shell选项“ OPTIONNAME”无法与我的脚本一起正常使用

无法使 highlight.js 与我的 Javascript 功能一起使用

Web开发人员的JavaScript代码无法与我的html网站一起使用

无法使BOOST_FOREACH与我的自定义类一起使用

Javascript / jQuery无法与我的html和CSS一起使用?

无法使HTML5音频与我的MP3一起使用

.stop()无法与我的悬停一起使用,以使快速移动工作-jQuery

Oracle REGEXP_SUBSTR无法与我的模式一起使用

多媒体密钥无法与我的HP Probook 4540s一起使用

Paypal CreateBillingAgreement API调用无法与我的api凭据一起使用

JNativeHook键盘侦听器无法与我的Swing / GUI一起使用

为什么setMargins无法与我的RelativeLayout一起使用?

CardView Recycler无法与我的List <SomeModel>一起使用