2015-12-26 6 views
0

Хорошо, я некоторое время работаю в Java и C++, но Im new для OpenGL, поэтому я начал использовать библиотеку GLFW, я слежу за книгой под названием «OpenGL Super Bible 6th Edition ", но в режиме GLFW. Проблема здесь в том, что я перепроверял все и наблюдал за другими учебниками, а мои швы кода были в порядке, но ничего из шейдеров не видно. Я не знаю, соответствует ли часть, где я объявляю шейдерный src, или даже действительную форму.Ничего не видно в OpenGL

Спасибо за даже читать это :)

ПРИМЕЧАНИЕ: Я знаю, что это будет оказывать только точку, но я изменить размер его «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; 
} 
+0

Вы должны проверить, действительно ли ваши шейдеры собирают и связывают. Вы также должны проверить, какую версию OpenGL вы получили. Явный запрос основного профиля также может быть полезен на некоторых платформах. – derhass

ответ

2

Две переменные, содержащие источники шейдеров, называются неправильно. Вы потеряли исходный источник вершин в fragmentShader_src и источник фрагмента в vertexShader_src.

Вы можете легко обнаружить ошибку, если вы проверили компиляцию шейдеров и статус связывания. Вы должны добавить соответствующие if s и журналы печати, если компиляция шейдеров или их сбой не удались.

Кроме того, вам не хватает явного выбора версии OpenGL. Вы должны попросить GLFW дать вам «контекст совместимости OpenGL 4.3». («основной профиль» также работает, если вам не нужны устаревшие функции.) Проверьте документы GLFW для получения информации о том, как это сделать.

+0

Да, в моем Makefile theres много интересного, я переключил их, но он все еще не работает. Подождите, но я не знаю, как проверить компиляцию ошибок в файлах GLSL или даже проверить, все ли в порядке. – CavariuX

+0

@CavariuX Используйте любой хороший учебник OpenGL. Или https://www.opengl.org/sdk/docs/man/ Также проверьте статус возврата 'glewInit()'. Кроме того, вам не хватает выбора версии OpenGL. Вы должны попросить GLFW дать вам «контекст совместимости OpenGL 4.3». Чтобы узнать, как это сделать, ознакомьтесь с документами GLFW. – HolyBlackCat

Смежные вопросы