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);
}
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
Können Sie bitte Ihren Fragment-Shader posten? – Rabbid76