2013-05-26 41 views
0

我想绘制一个只有漫反射颜色的球体,但没有出现。所有的OpenGL代码都应该是正确的,因为如果我将“颜色”着色器与“纹理”着色器交换,所有内容都会很好地显示出来。简单的颜色GLSL着色器不输出任何东西

这是着色器选择代码。 if分支用于纹理对象,else分支仅用于纯色对象。

GL.Disable(EnableCap.Blend); 

if (phong.diffuseTexture != 0) 
{ 
    texturedShader.Enable(); 
    GL.UniformMatrix4(texturedShader.GetUniformLocation("view"), false, ref camView); 
    GL.UniformMatrix4(texturedShader.GetUniformLocation("projection"), false, ref Camera.main.projection); 

    GL.ActiveTexture(TextureUnit.Texture0); 
    GL.BindTexture(TextureTarget.Texture2D, phong.diffuseTexture); 
    int colorMapLoc = Shader.currentShader.GetUniformLocation("colorMap"); 
    if (colorMapLoc > -1) GL.Uniform1(colorMapLoc, 0); 
} 
else 
{ 
    coloredShader.Enable(); 
    GL.UniformMatrix4(texturedShader.GetUniformLocation("view"), false, ref camView); 
    GL.UniformMatrix4(texturedShader.GetUniformLocation("projection"), false, ref Camera.main.projection); 
} 

// Continues with the VBO rendering code... 

所以第一个分支工作,但第二个分支不输出任何东西。这是唯一的颜色着色器(大部分是刚刚从纹理着色器复制粘贴,这就是为什么有texcoords等仍然存在):

// VERTEX SHADER 
#version 330 

uniform mat4 projection; 
uniform mat4 view; 
uniform mat4 world; 

uniform vec3 diffuseColor; 

layout(location = 0) in vec3 in_position; 
layout(location = 1) in vec3 in_normal; 
layout(location = 2) in vec2 in_texcoord; 
layout(location = 3) in vec3 in_tangent; 
layout(location = 4) in vec3 in_binormal; 

out mat3 tangentToWorld; 
out vec2 texcoord; 
out vec3 normal; 
out vec3 color; 

void main(void)   
{ 
    gl_Position = projection * view * world * vec4(in_position, 1.0); 

    color = diffuseColor; 

    normal = (world * vec4(normalize(in_normal), 0.0)).xyz; 

    tangentToWorld[0] = (world * vec4(in_tangent, 0.0)).xyz; 
    tangentToWorld[1] = (world * vec4(in_binormal, 0.0)).xyz; 
    tangentToWorld[2] = (world * vec4(in_normal, 0.0)).xyz; 

    texcoord = in_texcoord; 
} 


// FRAGMENT SHADER 
#version 330 

in vec2 texcoord; 
in mat3 tangentToWorld; 
in vec3 normal; 
in vec3 color; 

layout(location = 0) out vec4 out_diffuse; 
layout(location = 1) out vec4 out_normal; 

void main(void)         
{ 
    out_diffuse = vec3(1, 0, 1, 1); 

    vec3 normal = vec3(0.5, 0.5, 1.0); 

    normal = 2.0 * normal - 1.0; 

    normal = tangentToWorld * normal; 
    normal = (normal + 1.0)/2; 
    normal = normalize(normal); 

    out_normal = vec4(normal.x, normal.y, normal.z, 1.0); 
} 

......而这里的纹理着色器:

// VERTEX SHADER 
#version 330 

uniform mat4 projection; 
uniform mat4 view; 
uniform mat4 world; 

layout(location = 0) in vec3 in_position; 
layout(location = 1) in vec3 in_normal; 
layout(location = 2) in vec2 in_texcoord; 
layout(location = 3) in vec3 in_tangent; 
layout(location = 4) in vec3 in_binormal; 

out mat3 tangentToWorld; 
out vec2 texcoord; 
out vec3 normal; 

void main(void)   
{ 
    gl_Position = projection * view * world * vec4(in_position, 1.0); 

    normal = (world * vec4(normalize(in_normal), 0.0)).xyz; 

    tangentToWorld[0] = (world * vec4(in_tangent, 0.0)).xyz; 
    tangentToWorld[1] = (world * vec4(in_binormal, 0.0)).xyz; 
    tangentToWorld[2] = (world * vec4(in_normal, 0.0)).xyz; 

    texcoord = in_texcoord; 
} 


// FRAGMENT SHADER 
#version 330 

in vec2 texcoord; 
in mat3 tangentToWorld; 
in vec3 normal; 

layout(location = 0) out vec3 out_diffuse; 
layout(location = 1) out vec4 out_normal; 

uniform sampler2D colorMap;    
uniform sampler2D normalMap; 

void main(void)         
{ 
    out_diffuse = texture(colorMap, texcoord).xyz; 

    vec3 normal = texture(normalMap, texcoord).xyz; 

    normal = 2.0 * normal - 1.0; 

    normal = tangentToWorld * normal; 
    normal = (normal + 1.0)/2; 
    normal = normalize(normal); 

    out_normal = vec4(normal.x, normal.y, normal.z, texture(normalMap, texcoord).a); 
} 

对于它的缘故,如果我与纹理着色器渲染的一切,我得到这个:

Textured shader

...这是我使用这两种着色器时,得到:

Both shaders

任何想法可能是造成这个?着色器的编译没有任何错误,并且一切与纹理着色器一起工作,它只是不着色的着色器。

+0

某些着色器代码片段似乎丢失。我在那里只看到一个着色源,哪一个是你的“纹理”,哪一个是你的“颜色”着色器? – datenwolf

回答

1

代替我解决了这个问题。在材料选择代码中,我有一个复制粘贴错误。我将视图和投影矩阵设置为错误着色器“texturedShader”,而我应该将它们设置为“coloredShader”。复制粘贴,甚至一次,孩子们!

1

在没有看到其他着色器的代码,我最好的猜测是,你必须启用

  • 混合一个glBlendFunc(GL_SRC_ALPHA, …)

  • 因为你的颜色着色器使用VEC3对于颜色输出,您隐式地获得了alpha = 0,这使得不可见。

但这只是一个猜测。为了检验这一假设在你的颜色片段着色器

// FRAGMENT SHADER 
#version 330 

layout(location = 0) out vec4 out_diffuse; 

void main(void)         
{ 
    out_diffuse = vec4(1, 0, 1, 1); 
} 
+0

我禁用了混合,添加四组件版本没有帮助。我添加了我用于着色和纹理着色器的完整着色器源代码。 – manabreak

+0

我试图在我的爱好项目中实现SSAO,但是对于法线和位置我有黑屏。这令我惊讶!我必须在渲染之前禁用GL_BLEND,并重新启用它。 – mudlee