当前位置: 首页 > 知识库问答 >
问题:

OpenGL 3/GLFW空白视口

阎嘉荣
2023-03-14

我要讲的是第二章http://www.open.gl遇到了一个我搞不懂的绘图问题。

int main()
{
    //Initialize GLFW, create the window and the context
    glfwInit();

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    GLFWwindow* window = glfwCreateWindow(1024, 768, "Open.GL Drawing 1", nullptr, nullptr);

    glfwMakeContextCurrent(window);

    //initialize GLEW after context creation
    glewExperimental = GL_TRUE;
    glewInit();

    //loading, compiling, and checking shaders takes place here
    [...]

    //create, link, and use the shader program
    GLuint shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glBindFragDataLocation(shaderProgram, 0, "outColor");
    glLinkProgram(shaderProgram);
    glUseProgram(shaderProgram);

    //create and bind the vao for the position data
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    //triangle vertecies
    GLfloat verticies[] = {
         0.0f,  0.5f,
         0.5f, -0.5f,
        -0.5f, -0.5f
    };

    //vbo for verticies
    GLuint vbo;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW);

    //link, define, and enable the position attribute (aka, the verticies)
    GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
    glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(posAttrib);

    //main loop!
    while(!glfwWindowShouldClose(window))
    {
        glfwPollEvents();

        if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
            glfwSetWindowShouldClose(window, GL_TRUE);

        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glDrawArrays(GL_TRIANGLES, 0, 3);

        glfwSwapBuffers(window);
    }

    //clean up after yourself
    glfwTerminate();

    glDeleteProgram(shaderProgram);
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    glDeleteBuffers(1, &vbo);
    glDeleteVertexArrays(1, &vao);

    return EXIT_SUCCESS;
}

顶点着色器:

#version 150

in vec2 position;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
}

片段着色器:

#version 150

out vec4 outColor;

void mian()
{
    outColor = vec4(1.0, 1.0, 1.0, 1.0);
}

编译

g++ -fdiagnostics-color -Wall -Wextra -std=c++11 -lGLEW -lGLU -lGL  -lglfw -o drawing1 drawing1.cpp

我没有收到任何警告,但程序运行时会出现一个空白屏幕。我检查了他链接的示例代码以及示例源代码的github副本。不幸的是,他使用的是SFML,而我使用的是GLFW,所以我试图弥补这个差异。

我尽了最大努力模仿他的示例代码(事物的排序等),并在main()的最后几行中添加了主循环(在教程中没有提到删除着色器或清除视口的颜色,但这些语句存在于他的示例代码中),但最终仍然得到相同的结果。检查glGetError()给了我一个无效的枚举错误,但这篇文章说这可能是glew实验性的预期行为。

在那之后,我不确定如何进一步孤立这个问题。我期待有人指出这显然是一个简单的错误

共有1个答案

唐炜
2023-03-14

正如Joey Dewd指出的,我没有很好地证明阅读我的着色器代码。郑重声明,是我在片段着色器中键入mian而不是main导致了问题。根据他的建议,我添加了代码来检查链接中的错误(我已经在检查编译错误),果然,当我重新创建我的错字时,链接器抱怨了。

Fragment info
-------------
(0) : error C3001: no program defined

谢谢乔伊

 类似资料:
  • 我能够从URL发送JSON响应,然后当我在RecyclerView上显示相同的响应时,得到的输出是空白的,但选项卡和导航抽屉仍然存在。运行该应用程序时也没有错误。我也在使用截击库。 问题:我在列出服务的RecylerView上没有得到任何输出。我会在这里贴出与RecyclerView相关的代码。另外,我已经在底部发布了堆栈跟踪。 serviceViewAdapter.java(适配器) fragm

  • 8.1 空行 空行将逻辑相关的代码段分隔开,以提高可读性。 下列情况应该总是使用两个空行: 一个源文件的两个片段之间 类声明和接口声明之间 下列情况应该总是使用一个空行: 两个方法之间 方法内的局部变量和方法的第一条语句之间 块注释(参见"5.1.1 节")或单行注释(参见"5.1.2 节")之前 一个方法内的两个逻辑段之间,用以提高可读性 8.2 空格 下列情况应该使用空格: 一个紧跟着括号的关

  • GLFW是一个OpenGL的应用框架,支持Linux和Windows。GLFW 主要用来处理特定操作系统下的特定任务,例如 OpenGL 窗口管理、分辨率切换、键盘、鼠标以及游戏手柄、定时器输入、线程创建等等。 更多的效果截图:http://glfw.sourceforge.net/screenshots.html

  • 我遇到了损坏的CSV问题,它在图像链接中有空白。 CSV文件由我的客户业务合作伙伴自动创建,约22000行。CSV中大约有30个链接被破坏,我无法修复。因为它每3小时更新一次。 所以,我试图想出一个自动的解决方案,但似乎没有任何效果。 问题在于图像链接,如以下链接:https://images.tyroo.de/GISLAVED_ULTRA_SPEED2�.jpg 它以前有空间。一些文件有3个空格

  • 每当我在片段的OnCreateView中添加这段代码时,我的模拟器就会变成空白??我有一个活动,在按下一个按钮后,它变为空白,因为包含这个片段的另一个活动被称为。 知道吗?这是日志 12-26 19:50:25.575 2254-2304/com。实例乌梅拉西夫。带OpenGLRenderer的chattris:未能在表面0xa36f3080上设置EGL\u交换行为,错误=EGL\u成功 12-2

  • 在运行中,模板中的 空白 处理在某种程度上来说是纠缠所有模板引擎的一个问题。 我们来看这个模板。我已经用颜色标记了模板中的组件: 文本, 插值, FTL 标签.。 使用 [BR] 来想象 换行。 <p>List of users:[BR] <#assign users = [{"name":"Joe", "hidden":false},[BR] {