【问题标题】:Nothing is showing up in OpenGLOpenGL 中没有显示任何内容
【发布时间】:2016-04-01 01:56:09
【问题描述】:

好吧,我在 java 和 c++ 中工作了一段时间,但我是 OpenGL 的新手,所以我开始使用一个名为 GLFW 的库,我一直在关注一本名为“OpenGL Super Bible 6th Edition”但处于 GLFW 模式的书.这里的问题是我已经重新检查了所有并观看了其他教程,我的代码接缝还不错,但着色器渲染没有任何效果。我不知道我声明shader 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;
}

【问题讨论】:

  • 您应该检查您的着色器是否真正编译和链接。您还应该检查您获得的 OpenGL 版本。在某些平台上,明确请求核心配置文件也可能会有所帮助。

标签: c++ opengl glfw


【解决方案1】:

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

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

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

【讨论】:

  • 是的,在我的 Makefile 中有很多花哨的东西,我已经切换了它们,但它仍然无法正常工作。等等,但我不知道如何检查 GLSL 文件中的错误编译,甚至不知道如何检查它是否正常。
  • @CavariuX 使用任何好的 OpenGL 教程。或opengl.org/sdk/docs/man 另外,检查glewInit() 的返回状态。此外,您缺少 OpenGL 版本选择。您应该要求 GLFW 为您提供“OpenGL 4.3 兼容性配置文件”上下文。查看 GLFW 文档了解如何操作。
猜你喜欢
  • 2014-09-29
  • 2020-03-24
  • 2014-07-21
  • 2016-02-19
  • 2020-06-16
  • 2021-02-05
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多