OpenGL漫反射着色器,对象未显示

时间:2012-09-15 15:20:00

标签: c++ opengl shader lighting vertex

我将Blender中的一个对象渲染到我的场景中,并正常加载法线。我正在使用Gourrad漫反射着色将ModelViewProjectionMatrix(CameraToClip * ModelToCamera)传递给着色器和3x3版本的ModelToCameraMatrix以与法线相乘。

然而,当我将输出颜色设置为DiffuseColor * Angle我的整个对象(在我的情况下是一个立方体)只是消失(甚至不是黑线,我的灰色背景上都没有显示)。当我将coloroutput替换为

theColor = Vec4(1.0f, 1.0f, 1.0f, 1.0f); 

它显示我的obj白色,没有任何阴影。我很好奇为什么我什么都没看到?我的着色器或我穿制服的方式有问题吗?

顶点着色器:

#version 330

layout(location = 0) in vec4 position;
layout(location = 1) in vec3 normal;

smooth out vec4 theColor;

uniform mat4 modelViewProjectionMatrix;

uniform vec3 lightDir;
uniform mat3 normalModelToCameraMatrix;

void main()
{
    gl_Position = modelViewProjectionMatrix * position;

    vec3 normCamSpace = normalize(normalModelToCameraMatrix * normal);

    vec4 diffuseColor = vec4(0.6f, 0.7f, 0.8f, 1.0f);

    float angle = dot(normCamSpace, lightDir);
    angle = clamp(angle, 0, 1);

    theColor = diffuseColor  * angle;
}

渲染方法:

stack.Translate(glm::vec3(0.0f, 0.0f, 3.0f));

glm::vec4 lightDirCameraSpace = stack.Top() * glm::vec4(1.5f, 1.0f, 0.0f, 0.0f);
glUniform3fv(lightDirUnif, 1, glm::value_ptr(lightDirCameraSpace));
glm::mat3 normalMatrix(stack.Top());
glUniformMatrix3fv(normalModelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(normalMatrix));


// Draw Blender object
glBindVertexArray(this->load.vertexArrayOBject);

glm::mat4 modelViewProjectionMatrix = cameraToClipMatrix * stack.Top();
glUniformMatrix4fv(modelViewProjectionMatrixUnif, 1, GL_FALSE, glm::value_ptr(modelViewProjectionMatrix));


glDrawElements(GL_TRIANGLES, this->load.indicesVec.size(), GL_UNSIGNED_INT, 0);

我看不出着色器和渲染部分有什么问题。

<小时/> 的更新 当使用glGetError时,似乎我不断得到错误代码1285,这似乎与“Out of Memory”问题有关。但是,我没有使用任何类型的纹理,所以我对为什么会发生这种情况感到困惑?

1 个答案:

答案 0 :(得分:1)

我的猜测是你:

  1. 启用混合和/或alpha测试
  2. 将您的angle乘以Alpha通道
  3. 得到的值实际上不是你想要的角度,对于所有重要的角度情况都以0结尾
  4. 所以alpha = 0,多边形都是透明的/ alpha测试的。

    首先应该做的是确保alpha始终为1.f,并且只调整rgb。你也可以关闭混合/ alpha测试。

    然后,根据需要修复实际计算角度变量的数学运算。