2012-05-01 33 views
4

我一直在试图弄清楚如何发送纹理到着色器,但我无法弄清楚。我的代码看起来不错,但我的第二个纹理是黑色的。将纹理传递给着色器

void setShaders() { 

    glEnable (GL_TEXTURE_2D); 
    v2 = glCreateShader(GL_VERTEX_SHADER); 
    f2 = glCreateShader(GL_FRAGMENT_SHADER);  


    load_shader(v2,"a.vert"); 
    load_shader(f2,"a.frag"); 

    glCompileShader(v2); 
    glCompileShader(f2); 

    p = glCreateProgram(); 

    glAttachShader(p,v2); 
    glAttachShader(p,f2); 

    GLubyte* textura=LoadImageToTexture("d.jpg"); 
    GLubyte* textura2=LoadImageToTexture("n.jpg"); 

    GLuint texturaID[2]; 
    glGenTextures(2, texturaID); 

    glBindTexture(GL_TEXTURE_2D, texturaID[0]); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA, w, h, 0, GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)textura); 


    glBindTexture(GL_TEXTURE_2D, texturaID[1]); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D,1,GL_RGBA, w, h, 0, GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)textura2); 


    glLinkProgram(p); 
    glUseProgram(p); 
    GLint baseImageLoc = glGetUniformLocation(p, "tex"); 
    GLint normImage = glGetUniformLocation(p, "norm"); 
    glUniform1i(baseImageLoc, 0); 
    glUniform1i(normImage, 1); 

    glActiveTexture(GL_TEXTURE0 + 0); 
    glBindTexture(GL_TEXTURE_2D, texturaID[0]); 

    glActiveTexture(GL_TEXTURE0 + 1); 
    glBindTexture(GL_TEXTURE_2D, texturaID[1]); 

} 

着色 [顶]

void main() 
{ 

    gl_TexCoord[0] = gl_MultiTexCoord0; 
    gl_Position = ftransform(); 
} 

uniform sampler2D tex; 
uniform sampler2D norm; 

[fragment] 
void main() 
{ 
    vec4 color = texture2D(tex,gl_TexCoord[0].st); 
    vec4 color2 = texture2D(norm,gl_TexCoord[0].st); 
    gl_FragColor = color*color2; 
} 

编辑这里是魔鬼!

glTexImage2D(GL_TEXTURE_2D,**1**,GL_RGBA, w, h, 0, GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)textura2); 

代替它应该是0

+0

GLSL'#version'指令在哪里? – genpfault

+0

是如此重要?我加了#version 120,但什么都没有 – user1075940

回答

4

你的第二个纹理好像在一个错误的方式创建:

glTexImage2D(GL_TEXTURE_2D,1,...); 

应该

glTexImage2D(GL_TEXTURE_2D,0,...); 

由于对于第二个问题,即使我不确定是否正确;当您对线条进行注释时,实际上将统一值保留为其默认值,即0。净效果因此与

glUniform1i(baseImageLoc, 0); 
相关问题