2011-02-24 107 views
1

我正在写一个延迟着色器,并且作为第一步之一,要熟悉GLSL并使用着色器和帧缓冲区,我试图通过着色器更改网格的颜色。 我有它通过调用与保持所述attachement阵列glDrawBuffers然后纹理结合到我的帧缓冲器链接到缓冲器中的一个:使用着色器改变颜色

glReadBuffer(GL_NONE); 
    GLint color_loc = glGetFragDataLocation(pass_prog,"out_Color"); 
    GLenum draws [1]; 
    draws[color_loc] = GL_COLOR_ATTACHMENT0; 
    glDrawBuffers(1, draws); 

    glBindTexture(GL_TEXTURE_2D, diffuseTexture);  
    glFramebufferTexture(GL_FRAMEBUFFER, draws[color_loc], diffuseTexture, 0); 

我有一个out_Color变量在我的片段着色器(否则它止跌”甚至编译),但我无法通过在着色器内设置该变量来设置网格的颜色。 有没有人有任何想法,为什么,可以向我解释?

感谢

编辑: 我的着色器: 的Vertex Shader

#version 330 


uniform mat4x4 u_Model; 
uniform mat4x4 u_View; 
uniform mat4x4 u_Persp; 
uniform mat4x4 u_InvTrans; 

in vec3 Position; 
in vec3 Normal; 

out vec3 fs_Normal; 
out vec4 fs_Position; 

void main(void) { 
    fs_Normal = (u_InvTrans*vec4(Normal,0.0f)).xyz; 
    vec4 world = u_Model * vec4(Position, 1.0); 
    vec4 camera = u_View * world; 
    fs_Position = camera; 
    gl_Position = u_Persp * camera; 
} 

片段着色器

#version 330 

uniform float u_Far; 

in vec3 fs_Normal; 
in vec4 fs_Position; 

out vec4 out_Normal; 
out vec4 out_Position; 
out vec4 out_Color; 

void main(void) 
{ 
    out_Normal = vec4(normalize(fs_Normal),0.0f); 
    out_Position = vec4(fs_Position.xyz,1.0f); //Tuck position into 0 1 range 
    out_Color = vec4(1.0f, 0.0f, 0.0f, 1.0f);//first three diffuse, last specular 
} 

而且我不是为了学做GLSL延期着色器。我正在学习GLSL,以使 成为推迟着色器。从设置纹理=)

多个源代码:

glActiveTexture(GL_TEXTURE0); 

glGenTextures(1, &depthTexture); 
glGenTextures(1, &normalTexture); 
glGenTextures(1, &positionTexture); 
glGenTextures(1, &diffuseTexture); 

//DEPTH TEXTURE 
glBindTexture(GL_TEXTURE_2D, depthTexture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); 

//NORMAL TEXTURE 
glBindTexture(GL_TEXTURE_2D, normalTexture);  
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);   
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F , w, h, 0, GL_RGBA, GL_FLOAT,0); 

//POSITION TEXTURE 
glBindTexture(GL_TEXTURE_2D, positionTexture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);   
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F , w, h, 0, GL_RGBA, GL_FLOAT,0); 

//DIFFUSE TEXTURE 
glBindTexture(GL_TEXTURE_2D, diffuseTexture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);   
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F , w, h, 0, GL_RGBA, GL_FLOAT,0); 

//create a framebuffer object 
glGenFramebuffers(1, &FBO); 
glBindFramebuffer(GL_FRAMEBUFFER, FBO); 

//Instruct openGL that we won't bind a color texture with the currently binded FBO 
glReadBuffer(GL_NONE); 
GLint normal_loc = glGetFragDataLocation(pass_prog,"out_Normal"); 
GLint position_loc = glGetFragDataLocation(pass_prog,"out_Position"); 
GLint color_loc = glGetFragDataLocation(pass_prog,"out_Color"); 
GLenum draws [3]; 
draws[normal_loc] = GL_COLOR_ATTACHMENT0; 
draws[position_loc] = GL_COLOR_ATTACHMENT1; 
draws[color_loc] = GL_COLOR_ATTACHMENT2; 
glDrawBuffers(3, draws); 

glBindTexture(GL_TEXTURE_2D, depthTexture); 
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0); 
glBindTexture(GL_TEXTURE_2D, normalTexture);  
glFramebufferTexture(GL_FRAMEBUFFER, draws[normal_loc], normalTexture, 0); 
glBindTexture(GL_TEXTURE_2D, positionTexture);  
glFramebufferTexture(GL_FRAMEBUFFER, draws[position_loc], positionTexture, 0); 
glBindTexture(GL_TEXTURE_2D, diffuseTexture);  
glFramebufferTexture(GL_FRAMEBUFFER, draws[color_loc], diffuseTexture, 0); 


check FBO status 
FBOstatus = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
if(FBOstatus != GL_FRAMEBUFFER_COMPLETE) { 
    printf("GL_FRAMEBUFFER_COMPLETE failed, CANNOT use FBO\n"); 
    checkFramebufferStatus(FBOstatus); 
} 


switch back to window-system-provided framebuffer 
glClear(GL_DEPTH_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

编辑: 我解决它。谢谢。

+0

你是什么意思的“/ /前三弥漫,最后镜面”?你没有纹理,因为你的着色器没有这样做。 – 2011-02-24 18:39:03

+0

解决方案是什么?你介意发布它,让其他人可以学习吗?谢谢 – fusi 2011-02-26 18:01:55

+0

@fusi我实际上并不确定解决方案,我得到了另一个bug,当我重新设置了它的一切工作正常。我肯定从第一个配置改变到最后一个,但我不知道是什么。抱歉。 – mdlha 2011-02-28 05:04:45

回答

1

你应该这样做。我认为out_color被声明为出vec4 out_Color:

Compile shaders and attach them to the program. 
glBindFragDataLocation(program, 0, "out_Color"); 
glLinkProgram(program); 
glUseProgram(program); 

GLenum drawBuffers[1] = { GL_COLOR_ATTACHMENT0 } 
glDrawBuffers(1, drawBuffers); 

Setup FBO. 

的它应该工作,如果它不,发表您的片段着色器和更多的源代码。顺便说一句,我也应该说,创建一个延迟渲染器来学习GLSL不是一个好主意。有更简单的方法来学习GLSL。

+0

我正在那样做。我已经有深度,位置和正常rendertargets工作,但由于某种原因,颜色不起作用。 – mdlha 2011-02-24 18:04:46