2015-05-18 33 views
0

以下是片段着色器的代碼,用於在地板和球體上生成紋理,並在其上方生成霧效果。片段着色器寫入超過1個輸出的錯誤

我得到一個錯誤,說「片段着色器寫入多於一種類型的輸出gl_FragData,gl_FragColor或用戶綁定的碎片數據。」當我嘗試編譯它。

out vec4 color; 
out vec2 texCoord; 

uniform int fogType; 
uniform int enableFloorTexture; 
uniform int sphereTexture; 
uniform int objectType; 
uniform sampler2D texture; 
uniform sampler1D stexture; 

void main() 
{ 
vec4 finColor = color; 
if (objectType == 1) 
{ 
    if(enableFloorTexture == 1) 
    { 
     finColor = color * texture2D(texture, texCoord); 
    } 
} 
else if (objectType == 2) 
{ 
    if(sphereTexture != 0) 
    { 
     finColor = color * texture1D(stexture, texCoord.x); 
    } 
} 

float fogFactor = 0.0; 
float fogDepth = (18.0 - 0.0); 
float fogDensity = 0.09; 
vec4 fogColor = vec4(0.7, 0.7, 0.7, 0.5); 
float z = gl_FragCoord.z/gl_FragCoord.w; 

if(fogType == 1) 
{ 
    fogFactor = (18.0 - z)/fogDepth; 
} 
else if (fogType == 2) 
{ 
    fogFactor = exp(-fogDensity * z ); 
} 
else if (fogType == 3) 
{ 
    fogFactor = exp(-fogDensity * fogDensity * z * z); 
} 
fogFactor = clamp(fogFactor, 0.0, 1.0); 

if(fogType == 0) 
{ 
    gl_FragColor = finColor; 
} 
else 
{ 
    gl_FragColor = mix(fogColor, finColor, fogFactor); 
}  
} 

回答

0

你有一些產出聲明:

out vec4 color; 
out vec2 texCoord; 

嘗試使他們的投入。

+0

嘗試這樣做。該程序不斷崩潰。沒有變化 – ke1411

+0

嗯。我會註釋掉大部分代碼,直到它編譯並且不會崩潰。然後取消註釋代碼,直到它再次破壞。希望在你取消註釋時會有一條線索...... –

1

在你的程序中讓我困惑的是你使用color作爲輸出,但是你在程序中使用它。這只是一支筆嗎?

如果你想使用#version 400輸出格式,輸出應該是這樣的:

layout(location = 0) out vec4 color;