2016-09-04 19 views
1

現在、遅延シェーディングをOpenGL 3.2に実装しようとしていますが、何を試しても解決できないという問題があります。遅延シェーディングOpenGLの実装

期待通りの2段階(ジオメトリパスとライティングパス)で実装しました。コンパイルして実行した後、画面には、ほぼ同じように見えるように準備したシーンが表示されます。オブジェクトの色は正確で、どこに、どのようにして欲しいのかも決まっています。

光の計算が色に影響を与えないように見えることは、これほどまでです。何時間もして、ポジションと法線のテクスチャにはカラーテクスチャと同じ内容が含まれているように見えました。

fragColor = lightIntensity * color;からfragColor = lightIntensity * norm;またはfragColor = lightIntensity * pos;に照明フラグメントシェーダの最後の行を変更する場合は、画面のレンダリング方法には全く影響を与えません。

何が間違っているのか把握するために多くのことを試みましたが、正直なところ、それが何であるか分かりません。
誰かが私を助けることができたらすばらしいでしょう。方法レンダリングマイ

は次のようになります。

void render() 
{ 

    //geometry pass 
    gBuffer->bindForWriting(); 
    geometryShader->use(true); 
    calculateGBuffer(); 


    //lighting pass 
    gBuffer->bindForReading(lightShader->programID()); 
    lightShader->use(true); 
    drawOnScreen(); 

} 

gBufferオブジェクトの初期化は、このようなものです:

void GBuffer::initializeFBO(int viewWidth, int viewHeight) 
{ 

    //initialize fbo and corresponding textures; 
    glGenFramebuffers(1, &fbo_ID); 
    glBindFramebuffer(GL_FRAMEBUFFER, fbo_ID); 

    glGenTextures(1, &colorTexture_ID); 
    glBindTexture(GL_TEXTURE_2D, colorTexture_ID); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, viewWidth, viewHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture_ID, 0); 

    glGenTextures(1, &posTexture_ID); 
    glBindTexture(GL_TEXTURE_2D, posTexture_ID); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, viewWidth, viewHeight, 0, GL_RGB, GL_FLOAT, NULL); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, posTexture_ID, 0); 

    glGenTextures(1, &normTexture_ID); 
    glBindTexture(GL_TEXTURE_2D, normTexture_ID); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, viewWidth, viewHeight, 0, GL_RGB, GL_FLOAT, NULL); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, normTexture_ID, 0); 

    GLuint attachments[3] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 }; 
    glDrawBuffers(3, attachments); 

    glGenRenderbuffers(1, &depthBuffer_ID); 
    glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer_ID); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, viewWidth, viewHeight); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer_ID); 



    //Check Status 
    if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
     qDebug() << "error while initializing framebuffer" << glCheckFramebufferStatus(GL_FRAMEBUFFER); 
    else{ 
     qDebug() << "framebuffer successfully created"; 
     initialized = true; 
    } 

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 

} 

方法bindForReadingbindForWriting

void GBuffer::bindForWriting() 
{ 
    glBindFramebuffer(GL_FRAMEBUFFER, fbo_ID); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
} 

void GBuffer::bindForReading(GLuint programID) 
{ 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, colorTexture_ID); 
    GLuint samplerTexture_ID = glGetUniformLocation(programID, "colorTexture"); 
    glUniform1i(samplerTexture_ID, 0); 

    glActiveTexture(GL_TEXTURE1); 
    glBindTexture(GL_TEXTURE_2D, posTexture_ID); 
    samplerTexture_ID = glGetUniformLocation(programID, "positionTexture"); 
    glUniform1i(samplerTexture_ID, 1); 

    glActiveTexture(GL_TEXTURE2); 
    glBindTexture(GL_TEXTURE_2D, normTexture_ID); 
    samplerTexture_ID = glGetUniformLocation(programID, "normTexture"); 
    glUniform1i(samplerTexture_ID, 2); 

} 

とAT最後の4つのシェイダー:

ジオメトリバーテックスシェーダ:

#version 150 
#extension GL_ARB_separate_shader_objects : enable 
uniform mat4 MVPMatrix; 
uniform mat4 modelMatrix; 

in vec4 in_position; 
in vec4 in_color; 
in vec2 in_texcoord; 
in vec3 in_norm; 

out vec4 color_varying; 
out vec3 frag_position; 
out vec3 norm_vec; 
out vec2 texcoord_varying; 

void main() 
{ 
    gl_Position = MVPMatrix * in_position; 
    vec4 worldPosition = (modelMatrix * in_position); 
    frag_position = worldPosition.xyz; 
    norm_vec = in_norm; 

    color_varying = in_color; 
    texcoord_varying = in_texcoord; 
} 

ジオメトリフラグメントシェーダ:

#version 150 
#extension GL_ARB_explicit_attrib_location : enable 

in vec4 color_varying; 
in vec3 frag_position; 
in vec3 norm_vec; 
in vec2 texcoord_varying; 

layout (location = 0) out vec4 fragColor; 
layout (location = 1) out vec3 fragPosition; 
layout (location = 2) out vec3 frag_norm_vec; 

uniform sampler2D myTexture; 

void main() 
{ 
    vec4 texel = texture(myTexture, texcoord_varying); 
    fragColor = texel * color_varying; 
    fragPosition = frag_position; 
    frag_norm_vec = normalize(norm_vec); 
} 

照明VertexShader:

#version 150 
#extension GL_ARB_explicit_attrib_location : enable 
layout (location = 0) in vec2 in_position; 

out vec2 texCoord; 

void main() 
{ 
    gl_Position = vec4(in_position, 0, 1.0f); 

    texCoord = in_position; 
    if(texCoord.x == -1.0f) 
     texCoord.x = 0.0f; 
    if(texCoord.y == -1.0f) 
     texCoord.y = 0.0f; 
} 

照明フラグメントシェーダ(それを短くする計算の点灯せず)

#version 150 
#extension GL_ARB_separate_shader_objects : enable 

out vec4 fragColor; 
in vec2 texCoord; 


uniform sampler2D colorTexture; 
uniform sampler2D positionTexture; 
uniform sampler2D normTexture; 

void main() 
{ 
    //extract fragment data from fbo 
    vec3 pos = texture(positionTexture, texCoord).rgb; 
    vec3 norm = texture(normTexture, texCoord).rgb; 
    vec4 color = texture(colorTexture, texCoord); 


    fragColor = lightIntensity * color; 
} 

コードスパミングのためにお試しください。エラーを絞り込むことはできません。

+1

"* Geometry Vertex Shader:*"シェーダ "の横にある"ジオメトリ "のような用語をどのように投げるかに注意してください。私たちはそれのためのシェーダステージを持っているので、その名前の私の最初の読書は、私があなたが使っていたものだと思うようにしました。 –

+1

"* OpenGL 3.1 *"そして、なぜあなたのシェーダーは '#version 150'を使用していますか?それはGL 3.2のものです。これはあなたの問題ではありませんが、使用しているOpenGLのバージョンははっきりしているはずです。 –

+0

ああ..もちろん私はバージョン3.2で開発していますが、私はそれを編集しました。 – hey0

答えて

1

問題は、ここでは業務のご注文で最も可能性が高いです。

gBuffer->bindForReading(lightShader->programID()); 
lightShader->use(true); 
bindForReading()で、あなたはこのような呼び出し持っ

:上に均一な値を設定

samplerTexture_ID = glGetUniformLocation(programID, "positionTexture"); 
glUniform1i(samplerTexture_ID, 1); 

glUniform*()電話を現在アクティブプログラム。lightShaderをの後にアクティブにすると、これらのユニフォームを持っていない可能性のある以前のアクティブなプログラムに均一な値が設定されます。

は、単純に、すでにこの問題を解決する可能性があるこれらの呼び出しの順序を変更する:

lightShader->use(true); 
gBuffer->bindForReading(lightShader->programID()); 

はまた、あなたはあなたのバッファの2のフォーマットとしてGL_RGB16Fを使用しています。使用するOpenGLの実装はこれをサポートしていますが、これは仕様でカラーレンダリングが必要な形式ではありません。プラットフォーム間でコードを動作させる場合は、GL_RGBA16Fを使用する必要があります。これは、カラーレンダリング可能であることが保証されています。

関連する問題