2

数か月前にボリューム レンダリングのデモ アプリケーションを実装しました。Windows XP-32 ビットではすべて正常に動作しました。ウィンドウと入力ライブラリとしてOpenGL -glew と SFML2.0-rcを使用しました。今。最近、Windows 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 ...
}

最後の言葉: - すべてが警告なし、エラーなしでコンパイルされます (デモの Qt 5.0.2 ポートと同じ) - glEnable(...)、opengl バージョンの変更、texelFetch の使用、およびなんとなく...明らかに、このコードのどこが悪いのかわかりません。- 元のコードははるかに複雑でしたが、実行されましたが、XP では実行され、Win7 では実行されませんでした。- など

4

1 に答える 1