2014-05-23 73 views
4

我在使用AntTweakBar與現代opengl(動態管道)和glfw3時遇到了一些麻煩。我正在使用一些着色器,我很確定這個問題是關於相機或着色器的。 鍵盤快捷方式工作,但我沒有花哨的窗口,我應該有:(Anttweakbar glfw3 OpenGL 3.2沒有繪圖

這裏是源

#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 

根據需要適應

+0

你不能編譯代碼使用第二個命令,即鏈接衝突。你應該使用'glew32s'和'-DGLEW_STATIC',而不是'glew32'。 –

+0

@ AndonM.Coleman與MVS不同的是mingw – Posva

+0

我想你可以編譯自己並調用靜態庫'glew32',但是如果你從SourceForge站點以二進制形式下載,那麼'glew32'就是動態的庫和'glew32s'是靜態的,這不會鏈接。 –

回答

4

我找到了解決辦法:由於我使用的核心是:

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

我需要改變這個TwInit(TW_OPENGL, NULL);TwInit(TW_OPENGL_CORE, NULL); 我不得不修補自制AntTweakBar版本,使這項工作