C++ OpenGL没有渲染我的多维数据集
我最近开始学习OpenGL,并在上提供了教程。最初的几个教程进行得很顺利,我在屏幕上看到了我的三角形。现在我继续学习立方体教程,但我遇到了以下问题。为了渲染我的立方体,我只对三角形程序做了两大更改:C++ OpenGL没有渲染我的多维数据集,c++,opengl,C++,Opengl,我最近开始学习OpenGL,并在上提供了教程。最初的几个教程进行得很顺利,我在屏幕上看到了我的三角形。现在我继续学习立方体教程,但我遇到了以下问题。为了渲染我的立方体,我只对三角形程序做了两大更改: 我通过添加更多顶点将三角形更改为立方体 我将所有初始化代码从主函数移到了其他不同的函数中 问题是,当我运行程序时,它编译得很好,并向我显示一个深蓝色屏幕(我为清除屏幕设置的颜色),但它不会渲染我的立方体 我的完整代码如下: #include "common/shader/loadShader.h
- 我通过添加更多顶点将三角形更改为立方体
- 我将所有初始化代码从主函数移到了其他不同的函数中
#include "common/shader/loadShader.h"
#include "common/logpp/log++.h"
#include <GL\glew.h>
#include <GL\glfw3.h>
#include <vector>
logpp::FileLog mainLog;
//Contains all functions for initializing OpenGL, GLEW and GLFW
namespace GLInit
{
void SetGLFWWindowHints()
{
glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); /*OpenGL 3.3*/
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
}
void InitGLFW()
{
if (!glfwInit())
{
logpp::Console::error("Failed to initialize GLFW!");
return;
}
SetGLFWWindowHints();
}
void InitGLEW()
{
glewExperimental = true; //Needed in core profile
if (glewInit() != GLEW_OK)
{
logpp::Console::error("Failed to initialize GLEW!");
return;
}
}
GLuint CreateVAO()
{
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
return VertexArrayID;
}
GLFWwindow* CreateWin(int width, int height, char const* caption)
{
auto window = glfwCreateWindow(width, height, caption, nullptr, nullptr);
if (window == nullptr)
{
std::string msg = "Failed to create window!";
logpp::Console::error(msg);
mainLog.write("[ERROR]: " + msg);
glfwTerminate();
return nullptr;
}
glfwMakeContextCurrent(window);
return window;
}
GLFWwindow* Init(int width, int height, char const* caption)
{
InitGLFW();
auto window = CreateWin(width, height, caption);
InitGLEW();
return window;
}
}
using namespace GLInit;
int main()
{
static const int VERTICES_IN_TRIANGLE = 3;
PathConverter::setBase(R"(C:\Users\michi_000\Desktop\C++\OpenGL\A Colored Cube\x64\Debug\)");
try
{
mainLog.open(PathConverter::convert("logs\\main.log"), false);
}
catch (logpp::FileLog::Exception e)
{
logpp::Console::error(e.what());
}
auto window = Init(800, 600, "A Colored Cube");
auto VertexArrayID = CreateVAO();
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
static const std::vector<GLfloat> cube //Vertices for the cube
{
-1.0f,-1.0f,-1.0f, // triangle 1 : begin
-1.0f,-1.0f, 1.0f,
-1.0f, 1.0f, 1.0f, // triangle 1 : end
1.0f, 1.0f,-1.0f, // triangle 2 : begin
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f,-1.0f, // triangle 2 : end
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f
};
static const std::vector<GLfloat> cube_colors
{
0.583f, 0.771f, 0.014f,
0.609f, 0.115f, 0.436f,
0.327f, 0.483f, 0.844f,
0.822f, 0.569f, 0.201f,
0.435f, 0.602f, 0.223f,
0.310f, 0.747f, 0.185f,
0.597f, 0.770f, 0.761f,
0.559f, 0.436f, 0.730f,
0.359f, 0.583f, 0.152f,
0.483f, 0.596f, 0.789f,
0.559f, 0.861f, 0.639f,
0.195f, 0.548f, 0.859f,
0.014f, 0.184f, 0.576f,
0.771f, 0.328f, 0.970f,
0.406f, 0.615f, 0.116f,
0.676f, 0.977f, 0.133f,
0.971f, 0.572f, 0.833f,
0.140f, 0.616f, 0.489f,
0.997f, 0.513f, 0.064f,
0.945f, 0.719f, 0.592f,
0.543f, 0.021f, 0.978f,
0.279f, 0.317f, 0.505f,
0.167f, 0.620f, 0.077f,
0.347f, 0.857f, 0.137f,
0.055f, 0.953f, 0.042f,
0.714f, 0.505f, 0.345f,
0.783f, 0.290f, 0.734f,
0.722f, 0.645f, 0.174f,
0.302f, 0.455f, 0.848f,
0.225f, 0.587f, 0.040f,
0.517f, 0.713f, 0.338f,
0.053f, 0.959f, 0.120f,
0.393f, 0.621f, 0.362f,
0.673f, 0.211f, 0.457f,
0.820f, 0.883f, 0.371f,
0.982f, 0.099f, 0.879f
};
/* static const std::vector<GLfloat> cube
{
1.0, -1.0, 0.0,
-1.0, -1.0, 0.0,
0.0, 1.0, 0.0
};*/
static const std::vector<GLfloat>::size_type triangleCount = cube.size() / VERTICES_IN_TRIANGLE;
GLuint programID = LoadShaders(PathConverter::convert("shaders\\vertex.glsl").c_str(),
PathConverter::convert("shaders\\fragment.glsl").c_str());
GLuint vertexBuffer;
glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, cube.size(), &cube, GL_STATIC_DRAW);
GLuint colorbuffer;
glGenBuffers(1, &colorbuffer);
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
glBufferData(GL_ARRAY_BUFFER, cube_colors.size(), &cube_colors, GL_STATIC_DRAW);
glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
do
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(programID);
glEnableVertexAttribArray(0); //enable vertices
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(0, triangleCount, GL_FLOAT, GL_FALSE, 0, nullptr);
glDisableVertexAttribArray(0);
// 2nd attribute buffer : colors
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
glVertexAttribPointer(
1, // attribute. No particular reason for 1, but must match the layout in the shader.
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
nullptr // array buffer offset
);
glDisableVertexAttribArray(1);
logpp::Console::debug("Drawing triangles");
glDrawArrays(GL_TRIANGLES, 0, triangleCount);
// glDisableVertexAttribArray(0);
glfwSwapBuffers(window);
glfwPollEvents();
} while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS
&& !glfwWindowShouldClose(window));
glfwTerminate();
return 0;
}
#包括“common/shader/loadShader.h”
#包括“common/logpp/log++.h”
#包括
#包括
#包括
logpp::FileLog mainLog;
//包含初始化OpenGL、GLEW和GLFW的所有函数
名称空间GLInit
{
void setglfwWindowHights()
{
glfwWindowHint(GLFW_样本,4个);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);/*OpenGL 3.3*/
glfwWindowHint(GLFW_上下文_版本_小调,3);
#苹果__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);
#恩迪夫
glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_核心配置文件);
}
void InitGLFW()
{
如果(!glfwInit())
{
logpp::Console::错误(“初始化GLFW失败!”);
返回;
}
setglfwWindowHits();
}
void InitGLEW()
{
glewExperimental=true;//核心配置文件中需要
如果(glewInit()!=GLEW\u确定)
{
logpp::Console::错误(“未能初始化GLEW!”);
返回;
}
}
GLuint CreateVAO()
{
胶合垂直排列;
glgenvertexarray(1和VertexArrayID);
glBindVertexArray(VertexArrayID);
返回VertexArrayID;
}
GLFWwindow*CreateWin(整数宽度、整数高度、字符常量*标题)
{
自动窗口=glfwCreateWindow(宽度、高度、标题、空PTR、空PTR);
如果(窗口==nullptr)
{
std::string msg=“创建窗口失败!”;
logpp::Console::error(msg);
mainLog.write(“[错误]:”+msg);
glfwTerminate();
返回空ptr;
}
glfwMakeContextCurrent(窗口);
返回窗口;
}
GLFWwindow*Init(整数宽度、整数高度、字符常量*标题)
{
InitGLFW();
自动窗口=CreateWin(宽度、高度、标题);
InitGLEW();
返回窗口;
}
}
使用名称空间GLInit;
int main()
{
三角形中顶点的静态常数=3;
PathConverter::setBase(R“(C:\Users\michi\u 000\Desktop\C++\OpenGL\A Colored Cube\x64\Debug\);
尝试
{
mainLog.open(PathConverter::convert(“logs\\main.log”),false);
}
捕获(logpp::FileLog::异常e)
{
logpp::Console::error(例如what());
}
自动窗口=Init(800600,“彩色立方体”);
auto VertexArrayID=CreateVAO();
glfwSetInputMode(窗口,GLFW_粘滞键,GL_真);
静态常量std::向量多维数据集//多维数据集的顶点
{
-1.0f,-1.0f,-1.0f,//三角形1:开始
-1.0f,-1.0f,1.0f,
-1.0f,1.0f,1.0f,//三角形1:结束
1.0f,1.0f,-1.0f,//三角形2:开始
-1.0f,-1.0f,-1.0f,
-1.0f,1.0f,-1.0f,//三角形2:结束
1.0f,-1.0f,1.0f,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f,1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,1.0f,1.0f,
-1.0f,1.0f,-1.0f,
1.0f,-1.0f,1.0f,
-1.0f,-1.0f,1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,1.0f,1.0f,
-1.0f,-1.0f,1.0f,
1.0f,-1.0f,1.0f,
1.0f,1.0f,1.0f,
1.0f,-1.0f,-1.0f,
1.0f,1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f,1.0f,1.0f,
1.0f,-1.0f,1.0f,
1.0f,1.0f,1.0f,
1.0f,1.0f,-1.0f,
-1.0f,1.0f,-1.0f,
1.0f,1.0f,1.0f,
-1.0f,1.0f,-1.0f,
-1.0f,1.0f,1.0f,
1.0f,1.0f,1.0f,
-1.0f,1.0f,1.0f,
1.0f,-1.0f,1.0f
};
静态常量标准::矢量立方体颜色
{
0.583f、0.771f、0.014f、,
0.609f、0.115f、0.436f、,
0.327f、0.483f、0.844f、,
0.822f、0.569f、0.201f、,
0.435f、0.602f、0.223f、,
0.310f、0.747f、0.185f、,
0.597f、0.770f、0.761f、,
0.559f、0.436f、0.730f、,
0.359f、0.583f、0.152f、,
0.483f、0.596f、0.789f、,
0.559f、0.861f、0.639f、,
0.195华氏度,0.548华氏度,0.859华氏度,
0.014f、0.184f、0.576f、,
0.771f、0.328f、0.970f、,
0.406f、0.615f、0.116f、,
0.676f、0.977f、0.133f、,
0.971f、0.572f、0.833f、,
0.140f、0.616f、0.489f、,
0.997f、0.513f、0.064f、,
0.945f、0.719f、0.592f、,
0.543f、0.021f、0.978f、,
0.279f、0.317f、0.505f、,
0.167华氏度,0.620华氏度,0.077华氏度,
0.347f,0.857f,0.137f,
0.055f、0.953f、0.042f、,
0.714f、0.505f、0.345f、,
0.783f、0.290f、0.734f、,
0.722f、0.645f、0.174f、,
0.302f、0.455f、0.848f、,
0.225f、0.587f、0.040f、,
0.517f、0.713f、0.338f、,
0.053f、0.959f、0.120f、,
0.393f、0.621f、0.362f、,
0.673f、0.211f、0.457f、,
0.820华氏度、0.883华氏度、0.371华氏度、,
0.982f、0.099f、0.879f
};
/*静态常量std::向量立方体
{
1.0, -1.0, 0.0,
-1.0, -1.0, 0.0,
0.0, 1.0, 0.0
};*/
静态常量std::vector::size\u type triangelcount=cube.size()/三角形中的顶点;
GLuint programID=LoadShaders(PathConverter::convert(“shaders\\vertex.glsl”).c_str(),
PathConverter::convert(“着色器\\fragment.glsl”).c_str();
GLuint顶点缓冲区;
glGenBuffers(1和vertexBuffer);
glBindBuffer(GL_数组_BUFFER,vertexBuffer);
glBufferData(GL_数组_BUFFER,cube.size(),&cube,G
glVertexAttribPointer(0, triangleCount, GL_FLOAT, GL_FALSE, 0, nullptr);
GLuint vertexBuffer;
glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER,
cube.size()*sizeof(GLfloat),
cube.data(),
GL_STATIC_DRAW);
GLuint colorbuffer;
glGenBuffers(1, &colorbuffer);
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
glBufferData(GL_ARRAY_BUFFER,
cube_colors.size()*sizeof(GLfloat),
cube_colors.data(),
GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
glDrawArrays(GL_TRIANGLES, 0, triangleCount);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);