2017-12-28 21 views
0

Ich möchte eine 2D-Kontur der Gauß-Funktion zeichnen (Z = f (x, y, Sigma)). x, y ist die Vertex`s x, y; z = 0. Ich bekomme eine Farbe von jedem Eckpunkt mit Z. Während Sigma zwischen 0,01-1,0 geändert wird, ändern sich Z und Farbwert. Wie aktualisiert man die Farbe?Wie ändert man die Farbe jedes Vertex dynamisch nach der Zeit oder einer Funktion?

glBufferData(GL_ARRAY_BUFFER, sizeof(GaussianVertexices), GaussianVertexices, GL_STATIC_DRAW);//GaussianVertexices contains Pos and Color; 
//... 
while (!glfwWindowShouldClose(window)) 
{ 
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    GaussShader.use(); 
    sigma += 0.01; 
    if (sigma>1.0) 
    { 
     sigma = 0.1; 
    } 
    // how can i update color value with sigma changed 
    glBindVertexArray(GaussVAO); 
    glPointSize(2.0f); 
    glDrawArrays(GL_POINTS, 0, POINTS_NUMS); 
    glfwSwapBuffers(window); 
    glfwPollEvents(); 
} 

Vertexshader:

#version 330 core 
layout(location=0) in vec2 apos; 
layout(location=1) in vec3 acolor; 

out vec3 color; 


void main() 
{ 
    gl_Position=vec4(apos.x,apos.y,0.0,1.0f); 
    color=acolor; 
} 

Fragment-Shader

#version 330 core 
in vec3 color; 
out vec4 fragColor; 

void main() 
{ 
    fragColor=vec4(color,0.5); 
} 

Update: i versucht, es in diesem.

while (!glfwWindowShouldClose(window)) 
    {//.... 
     GaussShader.use(); 
     sigma += 0.01; 
     CreateGuassColor(GaussVertexices, GaussColor); 
     if (sigma>1.0) 
     { 
      sigma = 0.01; 
     } 

     glBindVertexArray(GaussVAO); 
     glBindBuffer(GL_ARRAY_BUFFER, ColorVBO); 
     void *ptr = nullptr; 
      ptr = glMapBufferRange(GL_ARRAY_BUFFER, 0, sizeof(GaussColor), GL_MAP_WRITE_BIT); 

     memcpy(ptr, GaussColor, sizeof(GaussColor)); 
     glUnmapBuffer(GL_ARRAY_BUFFER); 
     glBindVertexArray(0); 
     glBindVertexArray(GaussVAO); 
     glPointSize(2.0f); 
     glDrawArrays(GL_POINTS, 0, POINTS_NUMS); 
    } 
+0

Ich schlage vor, einen Shader zu verwenden, der die Fragmentfarbe abhängig von einer einheitlichen Variable setzt. Der Wert der Uniform-Variable kann entweder die Farbe selbst oder das Sigma sein. – Rabbid76

+0

Können Sie bitte Ihren Fragment-Shader posten? – Rabbid76

Antwort

1

Anzahl:

uniform vec4 vertexColor; 

zu Ihrem Fragment-Shader.

Stellen Sie sicher, dass Sie die ID Ihres Shaderprogramms erhalten, wenn Sie es zum ersten Mal erstellen. Dies ist bevor Sie Ihren Vertex- und Fragment-Shader kompilieren und verknüpfen. Sie tun es mag:

GLuint gaussShaderProg = glCreateProgram(); 

dann tun:

GLint uniformLocation = glGetUniformLocation(gaussShaderProg, "vertexColor"); 

Dann in der Schleife:

while (!glfwWindowShouldClose(window)) 
{ 
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

    sigma += 0.01; 
    if (sigma>1.0) 
    { 
     sigma = 0.1; 
    } 

    GaussShader.use(); // Make sure the shader program is 
         // bound before trying to  update the uniform 

    float vertColor[] = { 1, 1, 1, 1 }; // Whatever colour you want 
    glUniform4fv(uniformLocation​, 1, (GLfloat*)vertColor​); // Now your fragment shader 
             // can access the updated colour 


    glBindVertexArray(GaussVAO); 
    glPointSize(2.0f); 
    glDrawArrays(GL_POINTS, 0, POINTS_NUMS); 
    glfwSwapBuffers(window); 
    glfwPollEvents(); 
} 

Dann in Ihren Fragment-Shader nur Ausgang die einheitliche Farbe (die vec4). Stellen Sie sicher, dass die vierte Komponente der Farbe 1 ist, für den Fall, dass Sie Alpha-Blending haben.

+0

Ich habe das versucht. Die Uniform gibt nur eine Farbe ab. Nicht die Farbe aller Punkte. Alle Punkte haben dieselbe Farbe. – JackChen

+0

Ich habe es auf diese Weise versucht. – JackChen

+0

@JackChen Ja, die Art, wie ich Ihnen gab, setzt eine Farbe. Wenn Sie jedem Eckpunkt eine andere Farbe geben wollen, gibt es zwei Möglichkeiten, die ich kenne. Eine Möglichkeit besteht darin, die Scheitelfarbe als Attribut zusammen mit den anderen Elementen wie Position und Normal und Texkoordinaten einzufügen, und bei jedem Rendern laden Sie die neuen Scheitelpunkte hoch, die die neuen Farben enthalten. Die andere Möglichkeit besteht darin, zu entscheiden, welche Farbe jeder Scheitelpunkt im Shader hat, und wahrscheinlich auch im Scheitelpunkt-Shader. Wenn die Farbe auf Ihrer Sigma-Variable basiert, haben Sie nur diese Sigma-Variable als Uniform. – Zebrafish

Verwandte Themen