【问题标题】:C++ OpenGL, using more than one uniformC++ OpenGL,使用多个统一
【发布时间】:2021-01-18 01:04:01
【问题描述】:

我学习 OpenGL,下面是我用 SFML + GLEW 编写的简单代码片段(一切正常):

    const char *vertexShaderSource =
        "#version 330 core\n"
        "layout (location = 0) in vec3 pos;\n"
        //"uniform vec2 offset = vec2(0.0f, 0.0f);\n";
        "uniform vec4 OurColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);\n"
        "out vec4 ourColor;\n"
        "void main()\n"
        "{\n"
        "   gl_Position = vec4(pos.x + 0.0f, pos.y + 0.0f, pos.z, 1.0);\n"
            "ourColor = OurColor;\n"
        "}\0";
    
    const char *fragmentShaderSource =
        "#version 330 core\n"
        "out vec4 color;\n"
        "in vec4 ourColor;\n"
        "void main()\n"
        "{\n"
        "   color = ourColor;\n"
        "}\0";

    // --------------------------------------

    GLfloat vertices[] = {
        -0.5f,  1.0f, 0.0f,
         0.5f,  1.0f, 0.5f,
         0.0f,  0.0f, 0.0f,
        -0.5f, -1.0f, -0.5f,
         0.5f, -1.0f, 1.0f,
    };

    GLuint indices[] = {
        0, 1, 2,
        2, 3, 4
    };

    GLuint VAO;
    glGenVertexArrays(1, &VAO);

    glBindVertexArray(VAO);

    GLuint EBO;
    glGenBuffers(1, &EBO);

    glBindBuffer(
        GL_ELEMENT_ARRAY_BUFFER,
        EBO
    );

    glBufferData(
        GL_ELEMENT_ARRAY_BUFFER,
        sizeof(indices),
        indices,
        GL_STATIC_DRAW
    );

    // create buffer
    GLuint VBO;
    glGenBuffers(1, &VBO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    // copy vertices to buffer
    glBufferData(
        GL_ARRAY_BUFFER,
        sizeof(vertices),
        vertices,
        GL_STATIC_DRAW
    );

    // --------------------------------------

    GLuint vertexShader;
    vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(
        vertexShader,
        1,
        &vertexShaderSource,
        nullptr
    );
    glCompileShader(vertexShader);

    GLint success;
    GLchar infoLog[512];
    glGetShaderiv(
        vertexShader,
        GL_COMPILE_STATUS,
        &success
    );

    if (!success) {
        glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);
        std::cerr << "Vertex shader compilation error: " << infoLog << "\n";
        std::cin.get();
        return EXIT_FAILURE;
    }

    // --------------------------------------

    GLuint fragmentShader;
    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(
        fragmentShader,
        1,
        &fragmentShaderSource,
        nullptr
    );
    glCompileShader(fragmentShader);

    glGetShaderiv(
        fragmentShader,
        GL_COMPILE_STATUS,
        &success
    );

    if (!success) {
        glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);
        std::cerr << "Fragment shader compilation error: " << infoLog << "\n";
        std::cin.get();
        return EXIT_FAILURE;
    }

    // --------------------------------------

    GLuint shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    glGetShaderiv(
        shaderProgram,
        GL_LINK_STATUS,
        &success
    );

    if (!success) {
        glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
        std::cerr << "Shader link error: " << infoLog << "\n";
        std::cin.get();
        return EXIT_FAILURE;
    }

    // --------------------------------------

    glUseProgram(shaderProgram);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(
        0,
        3,
        GL_FLOAT,
        GL_FALSE,
        3 * sizeof(GL_FLOAT),
        (GLvoid*)0
    );

    // --------------------------------------

    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

    bool running = true;

    sf::Clock clock;

    while (running) {
        sf::Event windowEvent;

        while (window.pollEvent(windowEvent)) {
            switch (windowEvent.type) {
                case sf::Event::Closed: running = false; break;
            }
        }

        float greenValue = std::sin(clock.getElapsedTime().asSeconds()) / 2.0 + 0.5f;

        // ---------------- OpenGL here ---------------

        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear( GL_COLOR_BUFFER_BIT );

        GLint vertexColorLocation = glGetUniformLocation(shaderProgram, "OurColor");
        //GLint vertexMovementLocation = glGetUniformLocation(shaderProgram, "offset");

        glUseProgram(shaderProgram);

        glUniform4f(vertexColorLocation, 0.f, greenValue, 0.f, 1.f);
        //glUniform2f(vertexMovementLocation, 0.5f, 1.f);

        glBindVertexArray(VAO);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

        // --------------------------------------------

        window.display();
    }

结果如我所料:

问题在于顶点着色器,当我取消注释行时:

uniform vec2 offset = vec2(0.0f, 0.0f);\n

我明白了:

我什至不在任何地方使用奥菲斯特制服。我不知道发生了什么,当我再向顶点着色器添加一个统一时,没有任何工作正常...我没有收到任何着色器编译错误。

提前感谢您的帮助!

【问题讨论】:

    标签: opengl


    【解决方案1】:

    这是 C++ 源代码中的一个简单错字。

        //"uniform vec2 offset = vec2(0.0f, 0.0f);\n";
    

    在行尾有一个额外的;字符串文字之外。删除它。

    您可能会发现启用更高级别的警告 (-Wall -Wextra) 或使用 C++ 自动格式化程序(如 clang-format)更容易检测到这些错误。这是我得到的警告:

    test.cpp:在函数“int main()”中: test.cpp:7:9:警告:语句无效 [-Wunused-value] 7 | "统一 vec4 OurColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);\n" | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~ 8 | "out vec4 ourColor;\n" | ~~~~~~~~~~~~~~~~~~~~~~ 9 | “无效的主要()\ n” | ~~~~~~~~~~~~~~~ 10 | "{\n" | ~~~~~ 11 | " gl_Position = vec4(pos.x + 0.0f, pos.y + 0.0f, pos.z, 1.0);\n" | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~ 12 | “我们的颜色 = 我们的颜色;\n” | ~~~~~~~~~~~~~~~~~~~~~~~~ 13 | "}\0"; | ~~~~~ [出口:1]

    这就是为什么我建议在编写 C++ 代码时使用-Wall -Wextra,或者如果您使用不同的编译器则使用类似级别的警告。您也可以考虑在开发时启用-Werror

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      相关资源
      最近更新 更多