c++ - GLSL:未呈现制服的变化

标签 c++ opengl glsl shader

我正在调整 OpenGL Superbible 2010 中的着色器示例以了解着色器的使用。

我想更改作为统一传递给漫反射光着色器的定向光的红色分量。载体

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

是全局定义的。

如果我在编译前指定变量而不是在代码运行时指定变量,我可以调整光的颜色。我正在使用的过剩键盘功能确实会在运行时增加颜色值,但不会重新加载修改后的制服。在 SetupRC 函数中,我找到了 diffuseColor uniform

的位置
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;
   }

这是通过 glutDisplayFunc 调用的 RenderScene 代码:

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

最佳答案

请告诉我您正在更改 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];

关于c++ - GLSL:未呈现制服的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5446446/

相关文章:

OpenGL 着色器错误 : 0:1: '' : syntax error #version

c++ - 段错误让我发疯

c++ - g++ 未定义对独立函数的引用

c++ - curl_easy_perform 返回 CURLE_WRITE_ERROR,但我不会写任何东西

c++ - 尝试使用取消引用的迭代器进行连接时,无法在字符串 vector 中连接字符串

c - GL 调用着色器并获取输出颜色

c++ - 避免花键挤出时出现扭曲伪影?

glsl - 计算着色器和工作组

opengl - GLSL 中到相机平面的距离为深度

c++ - 将对 const 指针的引用从指向非 const 的指针定位