c++ - OpenGL 中没有显示任何内容

标签 c++ opengl glfw

好吧,我已经在 java 和 c++ 中工作了一段时间,但我是 OpenGL 的新手,所以我开始使用一个名为 GLFW 的库,我一直在关注一本名为“OpenGL Super Bible 6th Edition”的书,但在 GLFW 模式下.这里的问题是我已经重新检查了所有内容并观看了其他教程,并且我的代码接缝没有问题,但着色器渲染中没有任何内容。我不知道我声明着色器 src 的部分是否可以,甚至是有效的形式。

谢谢你甚至阅读这篇文章:)

注意: 我知道它只会渲染一个点,但我用“glPointSize(40.0f);”调整了它的大小。

#include <GL/glew.h>
#define GLFW_DLL
#include <GLFW/glfw3.h> 
#include <stdio.h>
#include <iostream> 
#include "jelly/lua_manager.h"
#include "jelly/keysManager.h"

jelly::keys_buttons::KeysManager km; 

GLuint vertex_array_obj;
GLuint program;

GLuint startRender(GLFWwindow* window)
{
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

    std::cout << "ASD" << std::endl;

    static const GLchar * fragmentShader_src[] =
    {
        "#version 430 core                                                      \n"
        "                                                                       \n"
        "void main(void)                                                        \n"
        "{                                                                      \n"
        "   gl_Position = vec4(0, 0.5, 0.0, 1);                                 \n"
        "}                                                                      \n"
    };

    static const GLchar * vertexShader_src[] =
    {
        "#version 430 core                          \n"
        "                                           \n"
        "out vec4 color;                            \n"
        "                                           \n"
        "void main(void)                            \n"
        "{                                          \n"
        "   color = vec4(0.0, 0.8, 1.0, 1.0);       \n"
        "}                                          \n"
    };

    glShaderSource(vertexShader, 1, vertexShader_src, NULL);
    glCompileShader(vertexShader);

    glShaderSource(fragmentShader, 1, fragmentShader_src, NULL);
    glCompileShader(fragmentShader);

    GLuint tprogram = glCreateProgram();
    glAttachShader(tprogram, vertexShader);
    glAttachShader(tprogram, fragmentShader);
    glLinkProgram(tprogram);
    glValidateProgram(tprogram);

    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    glGenVertexArrays(1, &vertex_array_obj);
    glBindVertexArray(vertex_array_obj);

    return tprogram;
}

void render(GLFWwindow* window)
{
    glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glDrawArrays(GL_POINTS, 0, 1);
    glPointSize(40.0f);
}

void mouseCallback(GLFWwindow* window, int button, int action, int mods)
{
    km.mouseClick(button, action, mods);
}

void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    km.keyPressed(key, action, mods);
}

int main()
{
    jelly::lua::LuaManager lm;

    // 0 = Build | 1 = Release | 2 = Alpha | 3 = Beta
    int buildType = 0;

    std::string title = "Relieved";

    if (buildType != 1)
    {
        switch (buildType) {
            case 0 :
                title += " | Build Version";
            break;
            case 2 :
                title += " | Alpha Version";
            break;
            case 3 :
                title += " | Beta Version";
            break;
            default :
            break;
        }
    }

    GLFWwindow* window;

    if (!glfwInit()) {
        glfwTerminate();
        return -1;
    }

    window = glfwCreateWindow(640, 400, title.c_str(), NULL, NULL);

    if (!window) {
        glfwTerminate();  
        return -1;
    }

    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;
    glewInit ();

    program = startRender(window);
    glUseProgram(program);

    glfwSetKeyCallback(window, keyCallback);
    glfwSetMouseButtonCallback(window, mouseCallback);

    while(!glfwWindowShouldClose(window))
    {
        render(window);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glDeleteVertexArrays(1, &vertex_array_obj);
    glDeleteProgram(program);
    glDeleteVertexArrays(1, &vertex_array_obj);

    glfwTerminate();    

    return 0;
}

最佳答案

包含着色器源的两个变量命名不正确。您将顶点源放错了 fragmentShader_src,将片段源放错了 vertexShader_src

如果您检查着色器编译和链接状态,您很容易发现错误。如果着色器编译或链接失败,您应该添加适当的 if 并打印日志。

此外,您还缺少明确的 OpenGL 版本选择。您应该要求 GLFW 为您提供“OpenGL 4.3 兼容性配置文件”上下文。 (如果您不需要任何已弃用的功能,“核心配置文件”也可以使用。)查看 GLFW 文档以获取有关如何操作的信息。

关于c++ - OpenGL 中没有显示任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34472816/

相关文章:

c++ - 在每次调用 : should I pass the engine, 分配或两者时生成不同数字的函数?

c++ - 如何将键盘事件发送到 Windows 中的各种应用程序?

c - 这两种类型在 OpenGL 中等效吗?

c++ - 在 Qt widget/QWindow 上显示过剩窗口

C++ OpenGL : Calling gluPerspective throws an undefined reference error?

c++ - 初始化 asio::ip::address_v6() 的最快方法?

c++ - 如何使用GL_TRIANGLE_FAN在OpenGL中画一个圆?

c++ - GLFW 在 Visual Studio Community 中不工作

c++ - OpenGL 不使用 GLFW 和 GLLoadGen 绘制 Mavericks

c++ - 尽管包含头文件和库,uuid 函数仍未定义