2017-12-28 28 views
0

ガウス関数(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); 
    } 
+0

フラグメントの色を設定するシェーダを使用することをお勧めします。これは、統一変数に依存します。一様変数の値は、色そのものでも「シグマ」でもかまいません。 – Rabbid76

+0

フラグメントシェーダーを投稿できますか? – Rabbid76

答えて

1

追加:

uniform vec4 vertexColor; 

あなたのフラグメントシェーダへ。

初めてシェーダープログラムを作成したときに、シェーダープログラムのIDを取得してください。これは、頂点シェーダとフラグメントシェーダをコンパイルしてリンクする前でもあります。あなたはそれが好きですか:

GLuint gaussShaderProg = glCreateProgram(); 

を、次に実行します。あなたのループで次に

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

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(); 
} 

その後、あなたのフラグメントシェーダでちょうど出力均一な色(vec4)。アルファブレンディングがある場合に備えて、カラーの4番目のコンポーネントが1であることを確認してください。

+0

これを試しました。ユニフォームは1つの色だけを通過します。すべての点が同じ色になります。 – JackChen

+0

私はこのように試しました。 – JackChen

+0

@JackChenはい、私があなたに与えたやり方は、一つの色を設定します。各頂点に異なる色を付ける場合は、私が知っているように2つの方法があります。 1つの方法は、頂点カラーを位置や法線、テクスチャなどの他の属性とともに属性としてパックし、新しい色を含む新しい頂点のセットをレンダリングするたびにパックすることです。もう1つの方法は、各頂点がどのシェーダーの色、より可能性の高い頂点シェーダーのいずれかの色を決定することです。色があなたのシグマ変数に基づいている場合、そのシグマ変数はユニフォームとしてしかありません。 – Zebrafish

関連する問題