2014-04-06 71 views
3

我的延期着色實施有一個奇怪的問題。 我渲染通過地鐵所需的信息到FBO,目前瀰漫,地位和在世界空間法線,它看起來像這樣:在OpenGL中延遲着色?

enter image description here

這是通過以下設置對所有樹的紋理進行:

dsShader->bind(); 
dsShader->enableVertexAttribArrays(); 

ds->diffuse->bind(GL_TEXTURE0); // "ds" is an FBO containing the textures 
ds->position->bind(GL_TEXTURE0+1); 
ds->normal->bind(GL_TEXTURE0+2); 

dsShader->sendUniform("diffuse", 0); 
dsShader->sendUniform("position", 1); 
dsShader->sendUniform("normal", 2); 

dsShader->sendUniform("camera", camera3D->position.x, camera3D->position.y, camera3D->position.z); 

dsOut->indexBuffer->bind(); 
dsOut->vertex2Buffer->bind(); 
dsOut->vertex2Buffer->vertexAttribPointer(dsShader->getAttribLocation("vertex0"), 2, GL_FLOAT, false, 0, 0); 

glDrawElements(GL_TRIANGLES, dsOut->indexBuffer->size(), GL_UNSIGNED_INT, 0); 

ds->diffuse->unbind(); 
ds->position->unbind(); 
ds->normal->unbind(); 

dsShader->disableVertexAttribArrays(); 
dsShader->unbind(); 

用下面的着色器(剛:

diffuse = std::shared_ptr<bb::Texture>(new bb::Texture(GL_TEXTURE_2D)); // generates texture ID 
diffuse->bind(); 
diffuse->texture2D(0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, 0); // glTexture2D 
diffuse->parameterf(GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
diffuse->parameterf(GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
diffuse->parameterf(GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
diffuse->parameterf(GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
diffuse->unbind(); 
texture2D(GL_COLOR_ATTACHMENT0+1, diffuse->getID(), 0); 

然後這些在我的畫階段使用所需要的部分時,光源被硬編碼):

struct DirLight{ 
    vec3 direction; 
    vec4 diffuse, specular; 
}; 

uniform sampler2D diffuse; 
uniform sampler2D position; 
uniform sampler2D normal; 

uniform vec3 camera; 

DirLight light0 = DirLight(vec3(1, 1, 0), vec4(0.3), vec4(0.1)); 

in vec2 vertex; 

void main(){ 
    vec4 color = texture(diffuse, vertex)*0.5; 
    vec3 p = vec3(texture(position, vertex)); 
    vec3 n = normalize(vec3(texture(normal, vertex))); 

    float ndotl = max(dot(n, normalize(light0.direction)), 0.0); // simple phong 

    if(ndotl > 0.0){ 
     color += ndotl*light0.diffuse; 
    } 

    gl_FragColor = color; 
} 

的怪異部分,如果我的光源方向設置爲負值,可以說:

DirLight light0 = DirLight(vec3(-1, 0, 0), vec4(0.3), vec4(0.1)); 

最終的結果是不陰影。它看起來正確的價值(或多或少)。 下面是輸出的圖片:

enter image description here

而且有也可能是與法線的問題,標誌着紅色區域。

+0

這聽起來像是你的法線問題。你有沒有嘗試渲染場景,沒有延期着色? – Gurgadurgen

+0

是的,我試過了,沒問題。您可以在第一張圖片中看到所有樹紋理的輸出。我忘記提及的是我的z軸是上軸。 – Kugel

+0

看起來你的法線在第一個中是相反的。我會建議嘗試解決這個問題,首先,然後再次回來並測試負值。 – Gurgadurgen

回答

2

好的Andon M. Coleman的解決方案工作,我將內部格式切換到GL_RGB8_SNORM。 感謝您的幫助:)

+3

由於這出現在國旗評審隊列中,因此這裏是評論者的註釋:這實際上*是*答案,而不是「謝謝」。目前沒有其他答案針對此問題發佈。問題評論中提出了答案,OP已在此處進行了有益的總結。@ user3476897:如果他決定發佈答案,建議接受Andon的答案。 –