2017-01-02 10 views
0

フレームごとに三角形の色を更新しようとしています。私は運がないので、なぜ誰かが私を助けてくれるのか分かりません。何度も試してみました。毎回データを更新する必要があります。OpenGLシェーダ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); 

これは、現在所与buffer objectに所定の配列でに格納されたデータをコピーするために、OpenGLを伝えます。 colorと格納されたバッファデータの間には何らかのリンケージはありません。 OpenGLは、このコマンドが処理された後にcolorを変更していることを知ることができません。

そしてglVertexAttrib3fvは、あなたが思っていることをしていません。

OpenGLバッファオブジェクト内のデータを変更する場合は、別のデータをバッファにアップロードするためにOpenGL呼び出しを行う必要があります。

さらに、スタティックバッファを作成しました(使用パラメータは0です)。静的バッファの全体点は、のstaticです。その内容は作成時点で固定されています。したがって、glNamedBufferSubDataのようなアップロードコマンドは機能しません。

したがって、バッファのデータを更新する方法を決定する必要があります。あなたはそれをマップし、ポインタを介してデータを変更したいですか?永続的にマッピングしますか?更新するためにglNamedBufferSubDataを使用しますか?それを更新する前にバッファを無効にしますか? OpenGLバッファオブジェクトを更新するには、多くの戦略があります。

最も簡単な1は無効と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

感謝。私の問題を解決した –

関連する問題