无法渲染到纹理(不再)

时间:2013-05-02 22:08:26

标签: opengl windows-7 glsl

几个月前我实现了一个卷渲染演示应用程序。在Windows XP-32位中一切正常。我使用 OpenGL -glew和SFML2.0-rc作为窗口和输入库。 现在。我刚刚搬到了7-64位的窗口。

该程序没有开箱即用,SFML似乎崩溃了。我将窗口库更改为GLFW,仍然使用Glew。通过代码我意识到纹理技术的基本渲染不再起作用。 所以我把所有东西都打破了一个小案例,所以我可以把它呈现给你。 (我还为Qt5.0.2制作了一个端口来交叉检查我的假设:相同的诊断)。

所以这就是问题所在:

程序应该渲染一个简单的单位立方体,前面剔除到第1遍的纹理。然后在第2遍中,我切换到背面剔除并再次渲染相同的立方体。在片段着色器(传递2)中,我可以选择读取纹理(从第1遍)并将其写入输出:但是当我看到正面剔除的立方体时,我会得到一个大黑屏...

初始化代码:

glGenFramebuffers(1, &raycastingFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, raycastingFrameBuffer);    
glGenTextures(1, &cubeRenderTexture);
glBindTexture(GL_TEXTURE_2D, cubeRenderTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, viewWidth, viewHeight, 0, GL_RGBA, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cubeRenderTexture, 0);

GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, DrawBuffers);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    return false;
glBindFramebuffer(GL_FRAMEBUFFER, 0);

渲染过程:

    // PASS ONE :
    //              render the unit cube (with front face culling) to texture
    //              we end up with a texture whose colors represent outgoing rays locations on the box
    //
    glBindFramebuffer(GL_FRAMEBUFFER, raycastingFrameBuffer);
    glEnable(GL_CULL_FACE);
    glDisable(GL_DEPTH_TEST);
    glViewport(0, 0, viewWidth, viewHeight);
    glCullFace(GL_FRONT);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glUseProgram(shaderRaycasting1.getProgramID());

        glBindBuffer(GL_ARRAY_BUFFER, cube_VBO_ID);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (char*)NULL + 0);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (char*)NULL + 108*sizeof(float));
        glEnableVertexAttribArray(1);
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glUniformMatrix4fv(glGetUniformLocation(shaderRaycasting1.getProgramID(), "modelview"), 1, GL_TRUE, modelview.getData());
        glUniformMatrix4fv(glGetUniformLocation(shaderRaycasting1.getProgramID(), "projection"), 1, GL_TRUE, projection.getData());

        glDrawArrays(GL_TRIANGLES, 0, 36);

        glDisableVertexAttribArray(1);
        glDisableVertexAttribArray(0);

    glUseProgram(0);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glEnable(GL_DEPTH_TEST);

    // PASS TWO :
    //              render the unit cube (with back face culling this time)
    //              we get colors representing ray entrance locations on the box
    //
    glViewport(0, 0, viewWidth, viewHeight);
    glCullFace(GL_BACK);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClearDepth(1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glUseProgram(shaderRaycasting2.getProgramID());

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, cubeRenderTexture);
        glUniform1i(cubeRenderTextureID, 0);

        glUniform1i(glGetUniformLocation(shaderRaycasting2.getProgramID(), "displayWidth"), (GLint) viewWidth);
        glUniform1i(glGetUniformLocation(shaderRaycasting2.getProgramID(), "displayHeight"), (GLint) viewHeight);

        glBindBuffer(GL_ARRAY_BUFFER, cube_VBO_ID);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (char*)NULL + 0);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (char*)NULL + 108*sizeof(float));
        glEnableVertexAttribArray(1);
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glUniformMatrix4fv(glGetUniformLocation(shaderRaycasting1.getProgramID(), "modelview"), 1, GL_TRUE, modelview.getData());
        glUniformMatrix4fv(glGetUniformLocation(shaderRaycasting1.getProgramID(), "projection"), 1, GL_TRUE, projection.getData());

        glDrawArrays(GL_TRIANGLES, 0, 36);

        glDisableVertexAttribArray(1);
        glDisableVertexAttribArray(0);
        glActiveTexture(0);

    glUseProgram(0);

...最后是最小片段着色器:

#version 330

in vec3 color;
uniform int displayWidth;
uniform int displayHeight;
uniform sampler2D cubeTex;
layout (location = 0) out vec4 outColor;

void main()
{
    float viewWidth = displayWidth;
    float viewHeight = displayHeight;

    vec3 boxIn  = color;
    vec2 cubeCoord = vec2( (gl_FragCoord.x - 0.5) / viewWidth,   (gl_FragCoord.y - 0.5) / viewHeight);
    vec3 boxOut = texture(cubeTex, cubeCoord).rgb;
    vec3 rayColor = boxOut;       

    outColor = vec4(rayColor, 1); // i get a black screen here ...
}

最后一句话: - Everything编译时没有警告,没有错误(对于演示的Qt 5.0.2端口也是如此) - 我尝试了所有可能的小“调整”,如glEnable(...),改变opengl版本,使用texelFetch,什么不...显然我找不到这个代码有什么问题。 - 原始代码更加复杂并且确实运行,但是在XP而不是在Win7上。 - 等等。

1 个答案:

答案 0 :(得分:0)

您是否安装了从供应商的驱动程序支持网站下载的GPU的原始供应商驱动程序,或者您是否仍安装了Windows 7附带的残缺版本?

Windows 7附带的驱动程序不提供现代OpenGL支持。微软剥夺了他们的任何OpenGL,Windows-7的默认OpenGL实现只是一个在Direct3D之上的OpenGL-1.4仿真。

如果您还没有,请从GPU供应商处下载原始驱动程序并安装这些驱动程序,然后报告这是否会改变结果。