我完成了立方体的顶点和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();
}
要解决这样的问题,最好将您的代码分解为更简单的部分,并一次测试一个部分。诊断渲染问题的一些技巧:
一旦在屏幕上显示something,您就可以将其构建回多维数据集。