我一直在试图弄清楚如何将纹理发送到着色器,但我无法理解。我的代码对我来说很好,但我的第二个纹理是黑色的。
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 );
而不是 1 ,它应该是0。
答案 0 :(得分:5)
你的第二个纹理似乎是以错误的方式创建的:
glTexImage2D(GL_TEXTURE_2D,1,...);
应该是
glTexImage2D(GL_TEXTURE_2D,0,...);
至于你的第二个问题,即使我不确定是否正确;当您对线条进行注释时,实际上将统一值保留为其默认值,即0。净效果因此与
相同glUniform1i(baseImageLoc, 0);