OpenGL VBO 没有绘制任何东西

Posted

技术标签:

【中文标题】OpenGL VBO 没有绘制任何东西【英文标题】:OpenGL VBO's not drawing anything 【发布时间】:2014-01-30 12:23:41 【问题描述】:

自从我上次与 VBO 合作以来已经有一段时间了,现在我正试图让它再次工作。但是,无论我做什么,除了 glClearColor 之外,我什么都渲染不了。

这是我的代码:

初始化 GL

...

vmml::vec3f eye = vmml::vec3f(0.0, 0.0, 0.0);
vmml::vec3f tar = vmml::vec3f(0.0, 0.0, 1.0);
vmml::vec3f up  = vmml::vec3f(0.0, 1.0, 0.0);
viewMatrix = lookAt(eye, tar, up);

创建盒子

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, 72 * sizeof(GLfloat), &vertices[0], GL_STATIC_DRAW);
glGenBuffers(1, &uvBuffer);
glBindBuffer(GL_ARRAY_BUFFER, uvBuffer);
glBufferData(GL_ARRAY_BUFFER, 48 * sizeof(GLfloat), &uvs[0], GL_STATIC_DRAW);
glGenBuffers(1, &normalBuffer);
glBindBuffer(GL_ARRAY_BUFFER, normalBuffer);
glBufferData(GL_ARRAY_BUFFER, 72 * sizeof(GLfloat), &normals[0], GL_STATIC_DRAW);

[code for adding material and texture to box...]

油漆GL

    [code for shadows...]

    glViewport(0, 0, width, height);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    shadeManager.bindShader(SHADOWSHADER);

    vmml::vec4f b1(0.5, 0.0, 0.0, 0.5);
    vmml::vec4f b2(0.0, 0.5, 0.0, 0.5);
    vmml::vec4f b3(0.0, 0.0, 0.5, 0.5);
    vmml::vec4f b4(0.0, 0.0, 0.0, 1.0);

    vmml::mat4f bias = vmml::mat4f::ZERO;
    bias.set_column(0, b1);
    bias.set_column(1, b2);
    bias.set_column(2, b3);
    bias.set_column(3, b4);

    vmml::mat4f depthBiasVP = bias * depthVP;

    GLuint depthBiasID  = glGetUniformLocation(shadowShaderID, "depthBiasVP");
    GLuint lightDirID   = glGetUniformLocation(shadowShaderID, "lightInvDir");
    GLuint shadowMapID  = glGetUniformLocation(shadowShaderID, "shadowMap");
    GLuint viewID       = glGetUniformLocation(shadowShaderID, "V");
    GLuint projectionID = glGetUniformLocation(shadowShaderID, "P");

    glUniformMatrix4fv(depthBiasID, 1, GL_FALSE, &depthBiasVP[0][0]);
    glUniform3fv(lightDirID, 1, &lightPos[0]);

    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, depthTextureID);
    glUniform1i(shadowMapID, 1);

    [calculate eye, target and up...]
    viewMatrix = lookAt(eye, target, up);

    glUniformMatrix4fv(viewID, 1, GL_FALSE, &viewMatrix[0][0]);
    glUniformMatrix4fv(projectionID, 1, GL_FALSE, &projectionMatrix[0][0]);

    currentFrustum->setActive(true);
    currentFrustum->extractFrustum(projectionMatrix, viewMatrix);
    scenegraph.render(false);

并渲染盒子

GLuint id = ShaderManager::getInstance().getShader(SHADOWSHADER);
    if (depthPass)
        id = ShaderManager::getInstance().getShader(DEPTHSHADER);

    GLuint mID    = glGetUniformLocation(id, "M");
    GLuint texID  = glGetUniformLocation(id, "tex");
    GLuint diffID = glGetUniformLocation(id, "diffMaterial");
    GLuint ambiID = glGetUniformLocation(id, "ambiMaterial");
    GLuint specID = glGetUniformLocation(id, "specMaterial");
    GLuint shinID = glGetUniformLocation(id, "shininess");

    glUniformMatrix4fv(mID, 1, GL_FALSE, &mod[0][0]);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glUniform1i(texID, 0);

    glUniform3fv(diffID, 1, &values.diffuseMaterial[0]);
    glUniform3fv(ambiID, 1, &values.ambientMaterial[0]);
    glUniform3fv(specID, 1, &values.specularMaterial[0]);
    glUniform1f(shinID, values.shinyMaterial[0]);

    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glVertexAttribPointer(
                0,
                3,
                GL_FLOAT,
                GL_FALSE,
                0,
                (void*)0
                );
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, uvBuffer);
    glVertexAttribPointer(
                1,
                2,
                GL_FLOAT,
                GL_FALSE,
                0,
                (void*)0
                );
    glEnableVertexAttribArray(1);

    glBindBuffer(GL_ARRAY_BUFFER, normalBuffer);
    glVertexAttribPointer(
                2,
                3,
                GL_FLOAT,
                GL_FALSE,
                0,
                (void*)0
                );
    glEnableVertexAttribArray(2);

    glDrawArrays(GL_QUADS, 0, 6 * 4 );

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(2);

着色器..

    #version 420 core

layout(location = 0) in vec3 vertexPos;
layout(location = 1) in vec2 vertexUV;
layout(location = 2) in vec3 vertexNorm;

out vec2 UV;
out vec3 position;
out vec3 normal;
out vec3 viewDirection;
out vec3 lightDirection;
out vec4 shadow;

uniform mat4 M;
uniform mat4 V;
uniform mat4 P;
uniform vec3 lightInvDir;
uniform mat4 depthBiasVP;

void main() 
    gl_Position = P * V * M * vec4(vertexPos, 1);

    UV = vertexUV;
    position = (M * vec4(vertexPos, 1)).xyz;
    normal = (V * M * vec4(vertexNorm, 0)).xyz;
    viewDirection = vec3(0,0,0) - (V * M * vec4(vertexPos, 1)).xyz;

    lightDirection = (V * vec4(lightInvDir, 0)).xyz;
    shadow = depthBiasVP * M * vec4(vertexPos, 1);


#version 420 core

in vec2 UV;
in vec3 position;
in vec3 normal;
in vec3 viewDirection;
in vec3 lightDirection;
in vec4 shadow;

layout(location = 0) out vec3 color;

uniform sampler2D tex;
uniform sampler2D shadowMap;

uniform vec3 diffLight;
uniform vec3 ambiLight;
uniform vec3 specLight;

uniform vec3 diffMaterial;
uniform vec3 ambiMaterial;
uniform vec3 specMaterial;
uniform float shininess;

vec2 disk[16] = vec2[] (
    vec2( -0.94201624, -0.39906216 ), 
    vec2( 0.94558609, -0.76890725 ), 
    vec2( -0.094184101, -0.92938870 ), 
    vec2( 0.34495938, 0.29387760 ), 
    vec2( -0.91588581, 0.45771432 ), 
    vec2( -0.81544232, -0.87912464 ), 
    vec2( -0.38277543, 0.27676845 ), 
    vec2( 0.97484398, 0.75648379 ), 
    vec2( 0.44323325, -0.97511554 ), 
    vec2( 0.53742981, -0.47373420 ), 
    vec2( -0.26496911, -0.41893023 ), 
    vec2( 0.79197514, 0.19090188 ), 
    vec2( -0.24188840, 0.99706507 ), 
    vec2( -0.81409955, 0.91437590 ), 
    vec2( 0.19984126, 0.78641367 ), 
    vec2( 0.14383161, -0.14100790 ) 
);

float random(vec3 seed, int i) 
    vec4 s = vec4(seed, i);
    float dotProduct = dot(s, vec4(12.9898, 78.233, 45.164, 94.673));
    return fract(sin(dotProduct) * 43758.5453);


void main() 
    vec3 materialDiffuseColor = diffMaterial * texture2D( tex, UV ).rgb;
    vec3 materialAmbientColor = ambiMaterial * materialDiffuseColor;
    vec3 materialSpecularColor = specMaterial;

    vec3 l = normalize(lightDirection);
    vec3 n = normalize(normal);
    vec3 v = normalize(viewDirection);
    vec3 ref = reflect(-l, n);

    float diff = clamp(dot(n, l), 0,1);
    float spec = clamp(dot(l, ref), 0,1);

    float visibility = 1.0;
    float bias = 0.005*tan(acos(diff));
    bias = clamp(bias, 0.0, 0.01);

    vec4 shadowCoordDivide = shadow / shadow.w;

    if (texture2D( shadowMap, shadowCoordDivide.xy ).z < shadowCoordDivide.z-bias) 
        //visibility = 0.5;
        diff = 0;
        spec = 0;
    

    color = 2 * ambiLight * materialAmbientColor;

    if (diff != 0) 
        color += visibility * diffLight * materialDiffuseColor * diff;

        float iSpec = pow(spec, shininess);
        color += visibility * specLight * materialSpecularColor * iSpec;
    

我已确保着色器加载正确,模型/视图/投影矩阵正确,但仍然没有。谁能指出我正确的方向?

Edit1:添加了我忘记的代码部分并删除了一些不重要的代码.. Edit2:将代码剥离到可能的错误区域

【问题讨论】:

请不要只是转储所有代码,而是要缩小到问题发生的位置。 是的,还有很多代码我没有转储。我只发布了相关区域。 当你不再需要你的 FBO 时,你会解绑它吗?并在绘制阴影贴图时再次绑定? 尝试使用像 gDebugger 这样的 openGL 调试器。它将为您提供 VBO 和纹理以及其他 unifrom/attributes 的信息。 叹息,我敢打赌我会在几秒钟内找到问题,只要我能让 gDebugger/CodeXL 工作......过去几个小时一直在尝试调试错误我'我在尝试运行它时得到... 【参考方案1】:

仅从您的渲染代码来看,您似乎并未将 View 和 Perspective 矩阵传递给您的顶点着色器。如果你引用一个没有被传入的制服会发生什么取决于你的 GPU 驱动程序有多好。有些会崩溃,有些会很乐意提供一些默认的后备矩阵,只是为了让着色器运行。可能是你的着色器看到了这个默认矩阵并且没有正确地转换你的盒子。

如果您在代码的其他地方正确传递了矩阵,请忽略此答案。它只是基于您粘贴的代码。

【讨论】:

哦,是的,忘记了那部分。我将矩阵传递给着色器。 是的,我以为你是,但检查一下不会有什么坏处:)

以上是关于OpenGL VBO 没有绘制任何东西的主要内容,如果未能解决你的问题,请参考以下文章

将 OpenGL 绘制列表转换为顶点数组或 VBO

如何使用 VBO 和单个 OpenGL drawelements 调用绘制多个对象?

OpenGL VBO 程序给出黑屏

OpenGL VBO 没有正确更新

打开 GL ES 2.0 为啥我的 VBO 不工作?

未能在 OpenGL/Android 中使用 VBO