2011-03-27 48 views
0

我正在調整OpenGL Superbible 2010中的着色器示例以瞭解有關着色器使用情況的信息。GLSL:未呈現制服的變化

我想改變作爲統一傳遞給漫反射光着色器的定向光的紅色分量。載體

GLfloat vDiffuseColor [] = {redDirectionalLight, greenDirectionalLight, blueDirectionalLight, 1.0f}; 

是全局定義的。

如果我在編譯之前指定了變量,但在代碼運行時沒有指定變量,我可以調整淺色。我正在使用的過剩鍵盤功能在運行時會增加顏色值,但修改後的制服不會被重新加載。在SetupRC功能我找到diffuseColor均勻

locColor = glGetUniformLocation(DirectionalLightSimpleDiffuseShader, "diffuseColor"); 

我在這裏失蹤的什麼位置?

vertex program: 
#version 130 

// Incoming per vertex... position and normal 
in vec4 vVertex; 
in vec3 vNormal; 

// Set per batch 
uniform vec4 diffuseColor; 
uniform vec3 vLightPosition; 
uniform mat4 mvpMatrix; 
uniform mat4 mvMatrix; 
uniform mat3 normalMatrix; 

// Color to fragment program 
smooth out vec4 vVaryingColor; 

void main(void) 
    { 
    // Get surface normal in eye coordinates 
    vec3 vEyeNormal = normalMatrix * vNormal; 

    // Get vertex position in eye coordinates 
    vec4 vPosition4 = mvMatrix * vVertex; 
    vec3 vPosition3 = vPosition4.xyz/vPosition4.w; 

    // Get vector to light source 
    vec3 vLightDir = normalize(vLightPosition - vPosition3); 

    // Dot product gives us diffuse intensity 
    float diff = max(0.0, dot(vEyeNormal, vLightDir)); 

    // Multiply intensity by diffuse color 
    vVaryingColor.rgb = diff * diffuseColor.rgb; 
    vVaryingColor.a = diffuseColor.a; 

    // Let's not forget to transform the geometry 
    gl_Position = mvpMatrix * vVertex; 
    } 

片斷程序:

#version 130 

out vec4 vFragColor; 
smooth in vec4 vVaryingColor; 

void main(void) 
    { 
    vFragColor = vVaryingColor; 
    } 

這裏的RenderScene代碼,它通過glutDisplayFunc稱爲:

void RenderScene (void) 
{ 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 



    modelViewMatrix.PushMatrix(); 

    M3DMatrix44f mCamera; // CAMERA MATRIX 

     cameraFrame.GetCameraMatrix(mCamera); 
    modelViewMatrix.PushMatrix(mCamera); 


    M3DMatrix44f vLightPos= {0.0f, 10.0f, 5.0f, 1.0f}; 
    M3DVector4f vLightEyePos; 
    m3dTransformVector4 (vLightEyePos, vLightPos, mCamera); 


    shaderManager.UseStockShader (GLT_SHADER_FLAT,transformPipeline.GetModelViewProjectionMatrix(), 
            vFloorColor); 


    floorBatch.Draw(); 

    for (int i=0; i<NUM_SPHERES; i++){ 

     modelViewMatrix.PushMatrix(); 
     modelViewMatrix.MultMatrix(spheres[i]); 


      glUseProgram (DirectionalLightSimpleDiffuseShader); 
      glUniform4fv (locColor, 1, vDiffuseColor); 
      glUniform3fv (locLight, 1, vEyeLight); 
      glUniformMatrix4fv (locMVP, 1, GL_FALSE, transformPipeline.GetModelViewProjectionMatrix()); 



      glUniformMatrix4fv (locMV, 1, GL_FALSE, transformPipeline.GetModelViewMatrix()); 
      glUniformMatrix3fv (locNM, 1, GL_FALSE, transformPipeline.GetNormalMatrix()); 


      sphereBatch.Draw(); 
     // glUseProgram(0); 
      modelViewMatrix.PopMatrix(); 
    } 
+0

它通常是有幫助的標記與您所使用的編程語言,你的問題。 – 2011-03-27 00:57:35

+0

這是C++,你想通了。 – andandandand 2011-03-27 01:27:24

+0

很酷。但是代碼看起來很像C99,Java或C#,我的使用引用的建議不起作用。 – 2011-03-27 01:30:45

回答

2

請告訴我你改變vDiffuseColor而不是redDirectionalLightgreenDirectionalLightblueDirectionalLight

GLfloat vDiffuseColor [] = {redDirectionalLight, greenDirectionalLight, blueDirectionalLight, 1.0f}; 

通過複製初始化程序生成一個數組,沒有連接到原始的三個變量。

如果你想解決的名字三個組成部分,而不是使用(假設C++):

GLfloat vDiffuseColor[4] = {0.0f, 0.0f, 0.0f, 1.0f}; 
GLfloat& redDirectionalLight = vDiffuseColor[0]; 
GLfloat& greenDirectionalLight = vDiffuseColor[1]; 
GLfloat& blueDirectionalLight = vDiffuseColor[2]; 
+0

謝謝,不知道,非常有用:) – andandandand 2011-03-27 01:26:33