2017-01-02 11 views
0

Я пытаюсь обновить цвет треугольника в каждом кадре. Мне не повезло, и я не могу понять, почему кто-то может помочь мне. Я пробовал несколько раз, меняя способ, которым я пытаюсь каждый раз обновлять данные. Любая помощь будет оценена по достоинству.Opengl shader vec3 не обновляется

#include <glew.h> 
#include <glfw3.h> 
#include <iostream> 
#include <fstream> 
#include <time.h> 
using namespace std; 

GLuint compileshaders() { 
    GLuint vshader, fshader, program; 

    static const GLchar * vshadersource[] = { 
     "#version 450 core    \n" 
     " layout (location=0) in vec3 position;\n" 
     " layout (location=1) in vec3 color;\n" 
     " out vec3 color_out    ;\n" 
     "void main()     \n" 
     "{        \n" 
     "color_out = color;    \n" 
     "gl_Position = vec4(position,1.0);\n" 
     "}        \n" 
    }; 

    static const GLchar * fshadersource[] = { 
     "#version 450 core    \n" 
     "in vec3 color_out;    \n" 
     "out vec4 colorO;     \n" 
     "void main()      \n" 
     "{        \n" 
     " colorO = vec4(color_out,1.0); \n" 
     "}        \n" 
    }; 

    vshader = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vshader, 1, vshadersource, NULL); 
    glCompileShader(vshader); 

    fshader = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(fshader, 1, fshadersource, NULL); 
    glCompileShader(fshader); 

    GLint vCompiled = 0; 
    glGetShaderiv(vshader, GL_COMPILE_STATUS, &vCompiled); 
    GLint fCompiled = 0; 
    glGetShaderiv(fshader, GL_COMPILE_STATUS, &fCompiled); 

    if (vCompiled && fCompiled != GL_FALSE) { 
     program = glCreateProgram(); 
     glAttachShader(program, vshader); 
     glAttachShader(program, fshader); 
     glLinkProgram(program); 
     glDeleteShader(vshader); 
     glDeleteShader(fshader); 
     return program; 
    } 
    else { 
     cout << "Shader Error!" << endl; 
    } 

    glDeleteShader(vshader); 
    glDeleteShader(fshader); 

    return NULL; 
} 

int main(void) 
{ 
    srand(time(0)); 
    GLFWwindow* window; 
    GLuint program; 
    GLuint vertex_array_object; 
    GLuint buffers[2]; 

    if (!glfwInit()) 
     return -1; 

    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); 
    if (!window) 
    { 
     glfwTerminate(); 
     return -1; 
    } 

    glfwMakeContextCurrent(window); 

    glewInit(); 

    static const GLfloat positions[] = {0.25,-0.25,0.5,0.25,0.25,0.5,-0.25,-0.25,0.5}; 
    static GLfloat color[] = {1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0}; 

    program = compileshaders(); 
    glUseProgram(program); 
    glCreateVertexArrays(1, &vertex_array_object); 
    glCreateBuffers(2, &buffers[0]); 
    glNamedBufferStorage(buffers[0], sizeof(positions), positions, 0); 
    glVertexArrayVertexBuffer(vertex_array_object, 0, buffers[0], 0, sizeof(GLfloat) * 3); 
    glVertexArrayAttribFormat(vertex_array_object, 0, 3, GL_FLOAT, GL_FALSE, 0); 
    glVertexArrayAttribBinding(vertex_array_object, 0, 0); 
    glEnableVertexArrayAttrib(vertex_array_object, 0); 
    glNamedBufferStorage(buffers[1], sizeof(color), color, 0); 
    glVertexArrayVertexBuffer(vertex_array_object, 1, buffers[1], 0, sizeof(GLfloat) * 3); 
    glVertexArrayAttribFormat(vertex_array_object, 1, 3, GL_FLOAT, GL_FALSE, 0); 
    glVertexArrayAttribBinding(vertex_array_object, 1, 1); 
    glEnableVertexArrayAttrib(vertex_array_object, 1); 
    glBindVertexArray(vertex_array_object); 

    GLfloat clearcolor[4] = { 0.0,0.0,0.0,1.0 }; 
    glPointSize(40); 

    int width, height; 
    while (!glfwWindowShouldClose(window)) 
    { 
     glfwGetWindowSize(window, &width, &height); 
     glViewport(0, 0, width, height); 
     glClearBufferfv(GL_COLOR, 0, clearcolor); 

     for (int i = 0; i < 9; i++) { 
      color[i] = (rand() % 2); 
     } 
     glVertexAttrib3fv(1, color); 

     glDrawArrays(GL_TRIANGLES, 0, 3); 

     glfwSwapBuffers(window); 
     glfwPollEvents(); 
    } 

    glDeleteVertexArrays(1,&vertex_array_object); 
    glDeleteProgram(program); 

    glfwTerminate(); 
    return 0; 
} 

ответ

1
glNamedBufferStorage(buffers[1], sizeof(color), color, 0); 

Это говорит OpenGL, чтобы скопировать данные , которые в настоящее время хранятся в данном массиве в данном buffer object. Он не создает некоторую связь между color и хранимыми данными буфера. OpenGL не может знать, что вы изменяете color после выполнения этой команды.

И glVertexAttrib3fv не делает то, что вы думаете.

Если вы хотите изменить данные в объекте буфера OpenGL, вы должны сделать вызов OpenGL для загрузки различных данных в буфер.

Кроме того, вы создали статический буфер (параметр использования - 0). Весь смысл статического буфера заключается в том, что это static: его содержимое фиксируется в момент его создания. Поэтому любая из команд загрузки, например glNamedBufferSubData, не работает.

Поэтому вам нужно решить, как вы хотите обновить данные буфера. Вы хотите сопоставить его и изменить данные с помощью указателя? Вы хотите настойчиво отображать его? Вы хотите использовать glNamedBufferSubData, чтобы обновить его? Вы хотите аннулировать буфер перед его обновлением? Существует множество стратегий обновления объектов буфера OpenGL.

Самый простой из них будет недействительным и использовать glNamedBufferSubData, но вам нужен соответствующий параметр использования для этого:

glNamedBufferStorage(buffers[1], sizeof(color), color, GL_DYNAMIC_STORAGE_BIT); 

...

while (!glfwWindowShouldClose(window)) 
{ 
    glfwGetWindowSize(window, &width, &height); 
    glViewport(0, 0, width, height); 
    glClearBufferfv(GL_COLOR, 0, clearcolor); 

    for (int i = 0; i < 9; i++) { 
     color[i] = (rand() % 2); 
    } 

    glInvalidateBufferData(buffer[1]); 
    glNamedBufferSubData(buffer[1], 0, sizeof(color), color); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glfwSwapBuffers(window); 
    glfwPollEvents(); 
} 
+0

Спасибо за помощь. Он исправил мою проблему –

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

  • Нет связанных вопросов^_^