- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我最近通过 http://www.opengl-tutorial.org 上的教程开始学习 OpenGL .前几个教程很顺利,我在屏幕上看到了我的三角形。现在我继续学习多维数据集教程,但我遇到了以下问题。我只对三角形程序进行了 2 次重大更改来渲染我的立方体:
问题是,当我运行该程序时,它可以正常编译并显示深蓝色屏幕(我为清除屏幕设置的颜色),但它不会渲染我的立方体。
我的完整代码在这里:
#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;
}
最后请注意,如果我删除颜色属性并将整个立方体设置为红色,它仍然会显示相同的深蓝色屏幕。
最佳答案
代码中有几个问题:
您将在绘制前禁用所有顶点属性。对 glDisableVertexAttribArray
的调用必须在 glDrawArrays
之后进行,否则在绘制时不会附加任何数据。
更好的解决方案是在主循环之前移动 VAO 设置并且根本不调用 glDisableVertexAttribArray
。指针永远不会改变,存储顶点属性设置正是 VAO 的用途。似乎教程在解释/使用它们方面不是很理想。
另一个问题是这一行:
glVertexAttribPointer(0, triangleCount, GL_FLOAT, GL_FALSE, 0, nullptr);
应该生成 GL_INVALID_VALUE
错误,因为大小(第二个参数)只允许为 1、2、3 或 4。在您的情况下,triangleCount 等于 12。大小描述了元素的数量 每个的顶点都应该消耗。所以如果属性的类型是vec3,那么它应该是3。
在询问 SO 之前,您应该始终检查 glGetError
是否返回任何错误。这会节省很多时间,因为您已经知道哪一行有问题。
另请注意,triangleCount 实际上并不包含三角形数,而是包含顶点数。
关于c++ - OpenGL 没有渲染我的立方体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48853400/
我有 3 个具有相同结构但数据不同的数据库,因为它们来自不同的客户端。 现在,我有一个现有的 SSAS 项目。其数据源 View 、多维数据集和维度只能使用或访问一个数据库。 我想要的是能够使用具有相
所以我的目标是将这些立方体放在一个网格上,并让它们排成一行,可以拖动和捕捉。我根据 this example 使立方体运行良好,但我没有完全理解某些机制,因此遇到了一些问题。 立方体开始时比旋转后大。
我正在解决一个问题,我需要使用 C# 处理内存中的多维数据。我的要求类似于 OLAP 多维数据集,但没有那么复杂。例如,我不需要计算或聚合或类似的东西。我基本上想使用多维键来引用数据。例如: var
我在 Cubical agda 工作,并试图为以后的证明建立一些通用的实用程序。其中之一是,对于任何类型 A,它与 Σ A (\_ -> Top) 类型“相同”,其中 Top是具有一个元素的类型。问题
我有这个在 WPF Viewport3D 中绘制立方体的代码:
以下代码是我目前写的使用三个js尝试移动或翻译 使用 WASD 键上下左右旋转立方体对象,并使用空格键重置到原始位置(屏幕中间)。我对三个 js 很陌生,我不知道如何让运动发挥作用。任何帮助将不胜感激
我想通过使用 opengl 来绘制体素,但它似乎不受支持。我制作了一个立方体绘制函数,它有 24 个顶点(每个面 4 个顶点),但是当你绘制 2500 个立方体时它会降低帧速率。我希望有更好的方法。理
我正在努力为盒子基元创建线框。尝试了颜色、不透明度和透明属性,但似乎都不起作用。这是代码 - 需要渲染这样的东西 - 最佳答案 您需要查看THREE.Material docs对于这个,有一点需要注
我有一个 opengl 立方体,我想对所有 6 个面进行纹理处理。 我需要多个纹理吗? 这是当前立方体的屏幕截图: 基本上我不知道如何将纹理包裹在整个立方体周围...... 这是我的 cube.h 头
我正在为《我的世界》编写一个模组,并遇到了一个令人困惑的数学问题。我想找到中心 block 周围所有 block 的 ID。为此,我想循环遍历 3x3 的方 block 并返回哪些是我想要的方 blo
这是我的问题:我一直在尝试让这个 CSS 立方体打开滚动。我做到了!这是它的工作原理:https://codepen.io/vaninoo/pen/BmyYQd 我很高兴。但是和 friend 测试过
我正在尝试创建 3 个具有相同视角的 3d 立方体,这些立方体将在悬停时旋转 90 度。它几乎适用于 chrome,但如果你仔细观察左侧立方体的底部边框,你会看到 1 条蓝色像素线。当您将鼠标悬停在右
我正在编写一个立方体,但无法使其正确旋转,有人可以帮我吗?我已经尝试了一切。我的代码链接如下: Codepen Link @keyframes spin { from { transform: r
我想创建一个 CSS 立方体,它有 4 个面(正面、背面、顶部、底部),并且它仅在 X 轴上不断向上(或向下)旋转。但出于某种原因,我无法对齐所有 4 个边,所以它看起来像一个立方体。这是我的标记:
啊哈!看来我的问题是我给 gluPerspective 的 zNear 值必须大于 0,而且我必须启用深度缓冲区才能使其工作。我更新了下面的代码以使其正常工作。 我尝试过很多次这样做,并且一直认为我以
我正在为学校开发一个使用 HTML5 和 CSS3 的元素。该元素的目标是教幼儿如何计算简单的方程式。学习这一点的第一步是教他们识别不同形状的数字。 第一个练习是:显示一个随机数并让 child 选择
我用 html 和 css 制作了一个旋转立方体。 当我按向右和向左箭头键时,立方体会按预期围绕其中心旋转。但是,当我按下向上和向下箭头键时,它会在更大的空间内旋转。 在这种情况下,我也希望它围绕其中
我正在努力让立方体在 opengl 中呈现。当我将已经计算出的 MVP 传递给顶点着色器时,它工作正常,但是当我传递模型、 View 和投影然后在顶点着色器中进行计算时,它不显示立方体。当我将顶点着色
大家好,我是 opengl 世界的新手,所以这就像一个星期我试图了解 opengl 是如何工作的。所以我放下我的代码使用不同的例子,我编译它没有问题。但是立方体没有出现,我不知道为什么。谁能向我解释我
我有一个应该绘制立方体的类。 它在主体中很好地绘制了我的立方体,但我使用默认的 x、y、z 值创建它,以便默认情况下将其置于屏幕中央。在通过调用 build 绘制立方体后,我想平移和缩放立方体,但我显
我是一名优秀的程序员,十分优秀!