本文介绍了Anttweakbar glfw3 OpenGL 3.2无法绘制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在将AntTweakBar与现代的opengl(动态管道)和glfw3结合使用时遇到了一些麻烦.我正在使用一些着色器,并且我很确定问题出在相机或着色器上.键盘快捷键可以用,但是我没有花哨的窗口,我应该有:(

I'm having some trouble using AntTweakBar with modern opengl (dynamic pipeline) and glfw3. I'm using some shaders and i'm pretty sure the problem is something about the camera or the shaders.The keyboard shortcuts are working but I don't have the fancy window I should have :(

这里是来源

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#if __cplusplus <= 199711L
#define nullptr NULL
#endif
#include <cmath>
#include <AntTweakBar.h>

const GLchar *vxShaderSrc = R"(
#version 150 core

in vec2 position;
in vec4 color;
uniform vec2 offset;

out vec4 Color;

void main()
{
    Color = color;
    gl_Position = vec4(position+offset, 0.0, 1.0);
}
)";

const GLchar *fragShaderSrc = R"(
#version 150 core
in vec4 Color;
out vec4 outColor;

void main()
{
    outColor = Color;
}
)";

inline void TwEventMouseButtonGLFW3(GLFWwindow* window, int button, int action, int mods)
{TwEventMouseButtonGLFW(button, action);}
inline void TwEventMousePosGLFW3(GLFWwindow* window, double xpos, double ypos)
{TwMouseMotion(int(xpos), int(ypos));}
inline void TwEventMouseWheelGLFW3(GLFWwindow* window, double xoffset, double yoffset)
{TwEventMouseWheelGLFW(yoffset);}
inline void TwEventKeyGLFW3(GLFWwindow* window, int key, int scancode, int action, int mods)
{TwEventKeyGLFW(key, action);}
inline void TwEventCharGLFW3(GLFWwindow* window, int codepoint)
{TwEventCharGLFW(codepoint, GLFW_PRESS);}
inline void TwWindowSizeGLFW3(GLFWwindow* window, int width, int height)
{TwWindowSize(width, height);}


int main()
{
    if (!glfwInit()) {
        std::cerr<<"Error initializing glfw...\n";
        return 1;
    }

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
#ifdef __APPLE__ // TODO is it ok to use it on Windows and Linux?
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);

    TwBar *bar;
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr); // Windowed
    if (!window) {
        std::cerr<<"Error creating window...\n";
        glfwTerminate();
        return 2;
    }
    glfwMakeContextCurrent(window);
    glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); // can be GLFW_CURSOR_HIDDEN

     // Initialize AntTweakBar
    TwInit(TW_OPENGL, NULL);

    // Create a tweak bar
    bar = TwNewBar("TweakBar");
    TwWindowSize(800, 600);
    int wire = 0;
    float bgColor[] = { 0.1f, 0.2f, 0.4f };
    TwDefine(" GLOBAL help='This example shows how to integrate AntTweakBar with GLFW and OpenGL.' "); // Message added to the help bar.
    // Add 'wire' to 'bar': it is a modifable variable of type TW_TYPE_BOOL32 (32 bits boolean). Its key shortcut is [w].
    TwAddVarRW(bar, "wire", TW_TYPE_BOOL32, &wire,
               " label='Wireframe mode' key=w help='Toggle wireframe display mode.' ");
    // Add 'bgColor' to 'bar': it is a modifable variable of type TW_TYPE_COLOR3F (3 floats color)
    TwAddVarRW(bar, "bgColor", TW_TYPE_COLOR3F, &bgColor, " label='Background color' ");

    // Set GLFW event callbacks
    // - Redirect window size changes to the callback function WindowSizeCB
    glfwSetWindowSizeCallback(window, (GLFWwindowposfun)TwWindowSizeGLFW3);

    glfwSetMouseButtonCallback(window, (GLFWmousebuttonfun)TwEventMouseButtonGLFW3);
    glfwSetCursorPosCallback(window, (GLFWcursorposfun)TwEventMousePosGLFW3);
    glfwSetScrollCallback(window, (GLFWscrollfun)TwEventMouseWheelGLFW3);
    glfwSetKeyCallback(window, (GLFWkeyfun)TwEventKeyGLFW3);
    glfwSetCharCallback(window, (GLFWcharfun)TwEventCharGLFW3);


    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_NO_ERROR) {
        std::cerr<<"Error initializing GLEW...\n";
        glfwTerminate();
        return 1;
    }

    GLuint vao;
    glGenVertexArrays(1, &vao);
    std::cout << "Created vertex array with id " << vao << "\n";
    glBindVertexArray(vao); // save the calls of vertexattribpointer and others, MUST BE before the EBO

    GLuint vbo;
    glGenBuffers(1, &vbo); // Generate 1 buffer
    std::cout << "Created Arrray with id " << vbo << "\n";
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    GLfloat vertices[] = {
        -0.5f, -0.5f, 1.f, 1.f, 1.0f, 1.f,
        -0.5f,  0.5f, 1.0f, 0.0f, 0.0f, 1.f,
        0.5f, -0.5f, 0.0f, 0.f, 1.0f, 1.f,
        0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.f,
        // some extra for elements testing
        0.0f,  0.5f, 1.0f, 0.0f, 0.0f, 1.f, // Vertex 1: Red
        0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.f, // Vertex 2: Green
        -0.25f, -0.5f, 0.0f, 0.f, 1.0f, 1.f // Vertex 3: Blue
    };

    // size is actually sizeof(float)*vertices.length
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    // elemets buffer object allows to use the same vertex multiple times
    GLuint elements[] = {
        0, 1, 2, 3
    };
    GLuint ebo;
    glGenBuffers(1, &ebo);
    std::cout << "Created elements with id " << ebo << "\n";
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);

    // create shaders
    GLint status; // for error checking
    char buffer[512];
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vxShaderSrc, NULL);
    glCompileShader(vertexShader);
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status);
    if (status != GL_TRUE) {
        glGetShaderInfoLog(vertexShader, 512, NULL, buffer);
        std::cerr<<"Error in shader: "<<buffer<<"\n";
    }

    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragShaderSrc, NULL);
    glCompileShader(fragmentShader);
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status);
    if (status != GL_TRUE) {
        glGetShaderInfoLog(fragmentShader, 512, NULL, buffer);
        std::cerr<<"Error in shader: "<<buffer<<"\n";
    }

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

    // bind the output
    // this is the actual output by default
    glBindFragDataLocation(shaderProgram, 0, "outColor");

    glLinkProgram(shaderProgram); // called everytime somethign change for the shader
    glUseProgram(shaderProgram);

    GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
    glEnableVertexAttribArray(posAttrib);
    glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), 0);
    GLint colAttrib = glGetAttribLocation(shaderProgram, "color");
    glEnableVertexAttribArray(colAttrib);
    glVertexAttribPointer(colAttrib, 4, GL_FLOAT, GL_FALSE,
                          6*sizeof(GLfloat), (void*)(2*sizeof(GLfloat)));

    GLint uniPos = glGetUniformLocation(shaderProgram, "offset");

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

        glPolygonMode( GL_FRONT_AND_BACK, wire?GL_LINE:GL_FILL );

        float time =  (float)glfwGetTime();

        // Clear the screen to black
        glClearColor(bgColor[0], bgColor[1], bgColor[2], 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glUniform2f(uniPos, cos(time*4.f)*0.5f, sin(time*4.f)*0.5f);
        glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0); // we can share vertex and we specify indexes

        glUniform2f(uniPos, 0.f, 0.f);
        // Draw tweak bars
        //glUseProgram(0);
        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        TwDraw();
        glUseProgram(shaderProgram);
        glBindVertexArray(vao);
        //glBindBuffer(GL_ARRAY_BUFFER, vbo);
        //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // clean up
    glDeleteProgram(shaderProgram);
    glDeleteShader(fragmentShader);
    glDeleteShader(vertexShader);

    glDeleteBuffers(1, &ebo);
    glDeleteBuffers(1, &vbo);

    glDeleteVertexArrays(1, &vao);

    TwTerminate();
    glfwTerminate();

    return 0;
}

您可以使用编译代码

g++ src/main.cpp -std=c++11 -DGLEW_STATIC -lGLEW -lglfw3 -framework OpenGL -lAntTweakBar

mingw32-g++.exe main.cpp -std=c++11 -DGLEW_STATIC -lglew32 -lglfw3 -lglu32 -lopengl32 -lgdi32 -lAntTweakBar

根据需要进行调整

推荐答案

我找到了解决方案:由于我正在使用CORE:

I found the solution: Since I'm using CORE:

glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);

我需要将此TwInit(TW_OPENGL, NULL);更改为TwInit(TW_OPENGL_CORE, NULL);我必须修补自制的AntTweakBar版本才能使它工作

I need to change this TwInit(TW_OPENGL, NULL); to TwInit(TW_OPENGL_CORE, NULL);I had to patch the homebrew AntTweakBar version to make this work

这篇关于Anttweakbar glfw3 OpenGL 3.2无法绘制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-11 21:36