2015-12-02 51 views
-1

我在一個對象上有多個着色器出現問題。 這是我的渲染代碼:一個對象上的兩個着色器

#include "MeshRenderer.h" 

ForwardAmbient* shader1; 
ForwardDirectional* shader2; 

MeshRenderer::MeshRenderer(Obj& obj) : 
    meshObject(obj) 
{ 
    shader1 = new ForwardAmbient(vec3(1, 1, 1)); 
    shader2 = new ForwardDirectional(vec3(1, 0, 0), vec3(1, 1, 1)); 
} 

MeshRenderer::~MeshRenderer() 
{ 

} 

void MeshRenderer::Render(RenderingCore* rc) 
{ 
    //for (Shader* shader : meshObject.shaders) 
    //{ 

    //} 

    shader1->Bind(); 
    shader1->UpdateShader(rc, transform, meshObject.material); 
    meshObject.material->GetTexture()->Bind(0); 
    meshObject.mesh->Render(); 

    shader2->Bind(); 
    shader2->UpdateShader(rc, transform, meshObject.material); 
    meshObject.material->GetTexture()->Bind(0); 
    meshObject.mesh->Render(); 

    /* 
    meshObject.shader->Bind(); 
    meshObject.shader->UpdateShader(rc, transform, meshObject.material); 
    meshObject.material->GetTexture()->Bind(0); 
    meshObject.mesh->Render(); 
    */ 
} 

環境light.vs:

#version 120 
attribute vec3 position; 
attribute vec2 texCoord; 
attribute vec3 normal; 

varying vec2 texCoord0; 

uniform mat4 transform; 
uniform mat4 projection; 

void main() 
{ 
    gl_Position = (projection * transform) * vec4(position, 1); 
    texCoord0 = texCoord; 
} 

環境light.fs:

#version 120 

varying vec2 texCoord0; 

uniform vec3 ambientLight; 
uniform float alpha; 
uniform sampler2D sampler; 

void main() 
{ 
    gl_FragColor = texture2D(sampler, texCoord0.xy) * vec4(ambientLight, alpha); 
} 

定向light.vs

#version 120 

attribute vec3 position; 
attribute vec2 texCoord; 
attribute vec3 normal; 

varying vec2 texCoord0; 
varying vec3 normal0; 
varying vec3 worldPos0; 

uniform mat4 transform; 
uniform mat4 projection; 

void main() 
{ 
    gl_Position = (projection * transform) * vec4(position, 1); 
    texCoord0 = texCoord; 
    normal0 = (transform * vec4(normal, 0)).xyz; 
    worldPos0 = (transform * vec4(position, 1)).xyz; 
} 

定向光.fs

#version 120 

varying vec2 texCoord0; 
varying vec3 normal0; 
varying vec3 worldPos0; 

uniform vec3 color; 
uniform float alpha; 

uniform vec3 direction; 
uniform float specularIntensity; 
uniform float specularPower; 
uniform vec3 eyePosition; 

uniform sampler2D sampler; 

vec4 calcLight(vec3 color, float alpha, vec3 direction, vec3 normal) 
{ 
    float diffuseFactor = dot(normal, -direction); 

    vec4 diffuseColor = vec4(0,0,0,0); 
    vec4 specularColor = vec4(0,0,0,0); 

    if(diffuseFactor > 0) 
    { 
     diffuseColor = vec4(color, 1.0) * diffuseFactor; 

     vec3 directionToEye = normalize(eyePosition - worldPos0); 
     vec3 reflectDirection = normalize(reflect(direction, normal)); 

     float specularFactor = dot(directionToEye, reflectDirection); 
     specularFactor = pow(specularFactor, specularPower); 

     if(specularFactor > 0) 
     { 
      specularColor = vec4(color, 1.0) * specularIntensity * specularFactor; 
     } 
    } 

    return diffuseColor + specularColor; 
} 

vec4 calcDirectionalLight(vec3 color, float alpha, vec3 direction, vec3 normal) 
{ 
    return calcLight(color, alpha, -direction, normal); 
} 

void main() 
{ 
    gl_FragColor = texture2D(sampler, texCoord0.xy) *  calcDirectionalLight(color, 1, direction, normalize(normal0)); 
} 

下面是結果: http://imgur.com/Bawny2P 只有環境光渲染,定向光沒有

+1

你在使用什麼庫?看起來你在'Render'函數中有兩個單獨的渲染過程。看起來好像你在假設多次調用'mesh-> Render()'會導致某種特定着色器效果的聚集,但我無法想象那會是這種情況。 –

+0

你有混合功能嗎? – BDL

+0

@OpenKastle我正在使用OpenGL庫,glew和glfw。 BDL是,glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); – MisterVento3

回答

1

你的問題是這樣的:

shader1->Bind(); 
shader1->UpdateShader(rc, transform, meshObject.material); 
meshObject.material->GetTexture()->Bind(0); 
meshObject.mesh->Render(); 

shader2->Bind(); 
shader2->UpdateShader(rc, transform, meshObject.material); 
meshObject.material->GetTexture()->Bind(0); 
meshObject.mesh->Render(); 

的OpenGL不知道是什麼「對象」是。它只是一次繪製點,線和三角形。爲了整理深度重疊,使用深度緩衝方法。當您使用完全相同的繪圖調用(meshObject.mesh->Render)並啓用了所有相同的頂點設置和深度測試時,兩個繪製調用之一將勝過另一個。

此外,更重要的是,繪圖調用不會「堆疊」。你不能簡單地通過多次繪製相同的東西來組合着色器;它可能適用於添加劑工藝。但是,這是在錯誤的樹上咆哮:不是節省額外的工作,而是複製了要完成的工作量。

您應該做的是將兩個着色器合併爲一個着色器,並使用合併的着色器只繪製一次幾何圖形。

+0

謝謝,我解決了,但我有新的問題,如何修復方向燈:http://imgur.com/uLEtoVF,我的代碼:http://pastebin.com/6xyzERqC – MisterVento3

+0

@ MisterVento3:看起來不像着色器但像一個幾何問題。圖像中出現的內容通常是使用共享頂點的原因,即對與其相接的立方體的所有3個面使用相同的頂點。一個頂點是整個元組''[position,normal,...]',如果你只改變if的一個位,你正在處理一個完全不同的頂點。對於立方體的每個面,法線都不相同,因此您有不同的頂點。 – datenwolf