Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL没有渲染,可能是由于一些简单的错误,我无法';找不到_C++_Opengl - Fatal编程技术网

C++ OpenGL没有渲染,可能是由于一些简单的错误,我无法';找不到

C++ OpenGL没有渲染,可能是由于一些简单的错误,我无法';找不到,c++,opengl,C++,Opengl,因此,这段代码应该渲染一个矩形(最终我希望它渲染一个立方体,但如果不能先绘制一个矩形,那么尝试这样做是没有意义的) 我有检查GL错误的代码,虽然有一个,但对此的回答让我觉得它不相关(它是GL\u INVALID\u ENUM,在glewInit();之后立即抛出) 这是我的密码: 主要内容: #包括 #包括 #包括 #包括 #包括 #包括 #定义GLEW_静态 #包括 #包括 GLuint VertexBuffer、VertexArray、ElementBuffer、着色器程序; GLfloat

因此,这段代码应该渲染一个矩形(最终我希望它渲染一个立方体,但如果不能先绘制一个矩形,那么尝试这样做是没有意义的)

我有检查GL错误的代码,虽然有一个,但对此的回答让我觉得它不相关(它是
GL\u INVALID\u ENUM
,在
glewInit();
之后立即抛出)

这是我的密码:

主要内容:

#包括
#包括
#包括
#包括
#包括
#包括
#定义GLEW_静态
#包括
#包括
GLuint VertexBuffer、VertexArray、ElementBuffer、着色器程序;
GLfloat顶点[]={
-0.5,0.5,0.5,//前左上角-0
0.5,0.5,0.5,//前右上角-1
0.5,-0.5,0.5,//前下右-2
-0.5,-0.5,0.5,//前下左-3
-0.5,0.5,-0.5,//左上角-4
0.5,0.5,-0.5,//右后上方-5
0.5,-0.5,-0.5,//后右下角-6
-0.5,-0.5,-0.5,//后左下角-7
};
胶合元素[]{
0,1,2,
2,3,0
};
int main()
{
校验错误(uuu函数uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
/*初始化*/
GLFWwindow*window=InitializeContext();
校验错误(uuu函数uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
//使用元素数组创建元素缓冲区对象
ElementBuffer=InitializeElementBuffer(elements,sizeof(elements)/sizeof(GLuint));
校验错误(uuu函数uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
//加载并编译着色器
ShaderProgram=加载着色器(“vertexshader.cpp”、“fragmentshader.cpp”);
校验错误(uuu函数uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
//创建顶点属性数组
VertexArray=创建VertexArray();
校验错误(uuu函数uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
//使用顶点数组创建顶点缓冲区对象
VertexBuffer=InitializeVertexBuffer(顶点,sizeof(顶点)/sizeof(GLfloat));
校验错误(uuu函数uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
//为数组指定适当的结构
初始化EvertexArray(着色器程序);
校验错误(uuu函数uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
而(!glfwWindowShouldClose(窗口))
{
如果(glfwGetKey(窗口,GLFW_键_退出)==GLFW_按){
glfwSetWindowShouldClose(窗口,GL_TRUE);
}
gld元素(GL_三角形,6,GL_无符号,0);
校验错误(uuu函数uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
glfwSwapBuffers(窗口);
glfwPollEvents();
}
校验错误(uuu函数uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
glfwTerminate();
}
  • (pastebin链接,因为SO似乎不希望我的帖子中有那么多文本)更新以修复用户3256930指出的缺陷
  • (出于同样的原因再次使用pastebin)
我很乐意按要求提供更多信息


注意:我以前能够画三角形,但我的旧代码没有告诉我为什么失败。

当您将数组作为函数参数传递时,它将其视为指针,并且您不能在函数中使用sizeof来获取数组的完整大小。在这种情况下,还需要将数组的大小作为函数参数传递。调用glBufferData时,size参数期望的是数组的字节大小,而不是数组中的元素数。

我发现了一些潜在问题。首先,在initializeVertexBuffer函数中有一个数组参数,并在函数中执行sizeof。这实际上只会给您一个单一的GLFLASH的大小,因为C++中如何处理数组参数,因此函数可能不加载所有数据。我建议为该函数添加一个size参数。第二个潜在问题是初始化VAO和VBO的顺序。您需要首先执行VAO,因为当您执行GLVERTEXAttributePointer调用时,它会跟踪哪些VBO被绑定。@user3256930使用
sizeof(顶点)
,所以我认为这不是问题所在。我必须看看VBO和VAO的创建顺序是否重要。该教程使用与sizeof相同的函数定义数组。您正在将数组作为函数参数传递。请参阅此帖子,了解为什么这不起作用:。在关于顶点数组的同一教程中,它还说您需要先创建VAO。@user3256930我做了您建议的更改:1。使元素和顶点缓冲区对象接受一个参数
size\u t size
,并让它打印值,确保它们是正确的2。将InitializeVertexArray拆分为CreatVertexArray和InitializeVertexArray(参见文章),但它仍然不会呈现任何内容。我认为在创建顶点数组后,还需要移动索引缓冲区的初始化。只是检查一下是否正常,但你在哪里设置颜色?这是在你的着色器中硬编码的吗?
#include <glm/glm.hpp>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <GL/gl.h>
#include <GL/glext.h>
#include <thread>

#define GLEW_STATIC
#include <GL/glew.h>

#include <engine.hpp>

GLuint VertexBuffer, VertexArray, ElementBuffer, ShaderProgram;

GLfloat vertices[] = {
         -0.5, 0.5, 0.5, // Front Top Left      - 0
         0.5,  0.5, 0.5, // Front Top Right     - 1
         0.5, -0.5, 0.5, // Front Bottom Right  - 2
         -0.5,-0.5, 0.5, // Front Bottom Left   - 3
         -0.5, 0.5,-0.5, // Back Top Left       - 4
         0.5,  0.5,-0.5, // Back Top Right      - 5
         0.5, -0.5,-0.5, // Back Bottom Right   - 6
         -0.5,-0.5,-0.5, // Back Bottom Left    - 7
};

GLuint elements[]{
    0,1,2,
    2,3,0
};

int main()
{
    CheckForGLErrors(__func__, __LINE__);

    /*Initialization*/
    GLFWwindow* window = InitializeContext();
    CheckForGLErrors(__func__, __LINE__);

    //Create our element buffer object using the elements array
    ElementBuffer = InitializeElementBuffer(elements, sizeof(elements)/sizeof(GLuint));
    CheckForGLErrors(__func__, __LINE__);

    //Load and compile the shaders
    ShaderProgram = LoadShaders("vertexshader.cpp", "fragmentshader.cpp");
    CheckForGLErrors(__func__, __LINE__);

    //Create our vertex attribute array
    VertexArray = CreateVertexArray();
    CheckForGLErrors(__func__, __LINE__);

    //Create our vertex  buffer object using the vertices array
    VertexBuffer = InitializeVertexBuffer(vertices, sizeof(vertices)/sizeof(GLfloat));
    CheckForGLErrors(__func__, __LINE__);

    //Assign our array the appropriate structure
    InitializeVertexArray(ShaderProgram);
    CheckForGLErrors(__func__, __LINE__);




    while(!glfwWindowShouldClose(window))
    {
        if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS){
            glfwSetWindowShouldClose(window, GL_TRUE);
        }

        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

        CheckForGLErrors(__func__, __LINE__);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    CheckForGLErrors(__func__, __LINE__);

    glfwTerminate();
}