为什么此多维数据集生成器类不呈现多维数据集?

问题描述 投票:-1回答:1

我完成了立方体的顶点和UV位置的工作。看到它起作用后,我决定制作一个CubeGenerator类,该类可以做一些事情。首先它将生成多维数据集,获取该多维数据集的位置,然后渲染该多维数据集。但是,出现了一些问题。首先,该多维数据集不再显示,我使用RenderDoc来查看问题所在,并且似乎只有一个问题,并且状态为no vertex shader bound at draw。我在多台不一致的服务器上工作,似乎没人能提供我所希望的帮助。我猜可能是几件事。首先,着色器无法正确生成/出于某些奇怪的原因找不到文件。其次,我之前从未使用过相机,因此我对相机视图矩阵的实现可能搞砸了,并且正在生成多维数据集,但我无法四处查看。或第三,以上全部。有人认为他们可以提供帮助吗?我知道基本代码(着色器,网格)可能很难理解,但是该代码是从我参加的一个粗略的课程中学习的,因此,任何有关如何更改它的建议也都很棒。如果需要,Github在这里是完整的东西(https://github.com/LegatAbyssWalker/OpenGL-Tests),下面是CubeGenerator类。

CubeGenerator.h

#ifndef CUBEGENERATOR_H
#define CUBEGENERATOR_H

#include "State.h"
#include "Mesh.h"
#include "Shader.h"
#include "Texture.h"
#include "Camera.h"

#include <iostream>
#include <vector>

class CubeGenerator {
    public:
        CubeGenerator() = default;
        CubeGenerator(const char* vShader, const char* fShader);

        void setTexture(const Texture& texture);
        void setPosition(glm::vec3 position = glm::vec3(0.f, 0.f, 0.f));
        void render(Camera& camera, const glm::mat4& projection);

    private:
        Mesh mesh;
        Shader shader;
        Texture texture;

        glm::vec3 position;

        std::vector<GLuint> vertices;

        //Uniform variables
        GLuint uniformModel = 0, uniformProjection = 0, uniformView = 0;
};

#endif

CubeGenerator.cpp

#include "CubeGenerator.h"

CubeGenerator::CubeGenerator(const char* vShader, const char* fShader) {
    std::vector<GLfloat> vertices{
        //   X   Y   Z   U     V  
        //1
            -1, -1,  1, 0.25, 0.34,
            -1, -1, -1, 0.25, 0.66,
            -1,  1,  1, 0.00, 0.34,
            -1,  1,  1, 0.00, 0.34,
            -1,  1, -1, 0.00, 0.66,
            -1, -1, -1, 0.25, 0.66,

        //2
            -1, -1, -1, 0.25, 0.66,
            -1, -1,  1, 0.25, 0.34,
             1, -1,  1, 0.50, 0.34,
             1, -1,  1, 0.50, 0.34,
             1, -1, -1, 0.50, 0.66,
            -1, -1, -1, 0.25, 0.66,

        //3
            -1,  1, -1, 0.25, 1.00,
            -1, -1, -1, 0.25, 0.66,
             1, -1, -1, 0.50, 0.66,
             1, -1, -1, 0.50, 0.66,
             1,  1, -1, 0.50, 1.00,
            -1,  1, -1, 0.25, 1.00,

        //4
            -1,  1,  1, 0.25, 0.00,
            -1, -1,  1, 0.25, 0.34,
             1, -1,  1, 0.50, 0.34,
             1, -1,  1, 0.50, 0.34,
             1,  1,  1, 0.50, 0.00,
            -1,  1,  1, 0.25, 0.00,

        //5
             1, -1,  1, 0.50, 0.34,
             1, -1, -1, 0.50, 0.66,
             1,  1,  1, 0.75, 0.34,
             1,  1,  1, 0.75, 0.34,
             1,  1, -1, 0.75, 0.66,
             1, -1, -1, 0.50, 0.66,

        //6
            -1,  1, -1, 1.00, 0.66,
            -1,  1,  1, 1.00, 0.34,
             1,  1,  1, 0.75, 0.34,
             1,  1,  1, 0.75, 0.34,
             1,  1, -1, 0.75, 0.66,
            -1,  1, -1, 1.00, 0.66
    };

    mesh.createMesh(vertices);
    shader.createFromFiles(vShader, fShader);
}

void CubeGenerator::setTexture(const Texture& texture) {
    this->texture = texture;
}

void CubeGenerator::setPosition(glm::vec3 position) {
    this->position = position;
}

void CubeGenerator::render(Camera& camera, const glm::mat4& projection) {
    shader.useShader();
    uniformModel = shader.getModelLocation();
    uniformProjection = shader.getProjectionLocation();
    uniformView = shader.getViewLocation();

    glm::mat4 model(1.f);
    model = glm::translate(model, position);
    model = glm::scale(model, glm::vec3(0.5f, 0.5f, 0.5f));
    //Camera matrix
    glm::mat4 view = camera.calculateViewMatrix();

    //Uniform
    glUniformMatrix4fv(uniformModel, 1, GL_FALSE, glm::value_ptr(model));
    glUniformMatrix4fv(uniformProjection, 1, GL_FALSE, glm::value_ptr(projection));
    glUniformMatrix4fv(uniformView, 1, GL_FALSE, glm::value_ptr(view));
    //Textures assignment
    texture.useTexture();

    //Rendering
    mesh.renderMesh();
}

c++ opengl shader cube vertices
1个回答
0
投票

要解决这样的问题,最好将您的代码分解为更简单的部分,并一次测试一个部分。诊断渲染问题的一些技巧:

  • 将背景清除为灰色。这样,如果形状是白色或黑色,您将不会错过:)
  • 如果深度缓冲区出现问题,请禁用深度测试:
  • 如果三角形朝后,则禁用多边形剔除
  • 如果您的Alpha = 0,则禁用混合
  • 禁用纹理化
  • 绘制单个三角形。
  • 启用调试回调(glDebugMessageCallback ....)并将断言添加到回调函数。
  • 设置正射投影;它可能比诊断投影矩阵容易。
  • 在nSight中运行代码;您可能会获得比RenderDoc更多的信息。

一旦在屏幕上显示something,您就可以将其构建回多维数据集。

© www.soinside.com 2019 - 2024. All rights reserved.