ガウス関数(Z = f(x、y、σ))の2次元輪郭を描きたい。 x、yは頂点のx、y; z = 0です。私はZを使ってすべての頂点の色を取得します。シグマは0.01〜1.0の間で変更されますが、Zと色の値は変更されます。どのように色を更新する?時間や機能によって、どのようにVertexの色を動的に変更するのですか?
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();
}
頂点シェーダ:
#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;
}
フラグメントシェーダ
#version 330 core
in vec3 color;
out vec4 fragColor;
void main()
{
fragColor=vec4(color,0.5);
}
更新: 私はこの中にそれを試してみました。
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);
}
フラグメントの色を設定するシェーダを使用することをお勧めします。これは、統一変数に依存します。一様変数の値は、色そのものでも「シグマ」でもかまいません。 – Rabbid76
フラグメントシェーダーを投稿できますか? – Rabbid76