2011-10-02 127 views
0

問題是我在着色器中傳遞了兩個紋理,但三維模型上的圖片對於兩個sampler2D變量(第一個圖像爲「normal.jpg」)是相同的。我會非常感激的幫助。下面是代碼:在着色器中傳遞紋理

GLuint _textures[2]; 

glEnable(GL_TEXTURE_2D); 

glGenTextures(2, _textures); 
glActiveTexture(GL_TEXTURE0); 
bump = [self loadTextureWithName: @"normal.jpg"]; 
//bump = [self loadTextureWithName: @"specular.jpg"]; 
glUniform1i(bump, 0); 

glActiveTexture(GL_TEXTURE1); 
diffuse = [self loadTextureWithName2: @"diffuse.jpg"]; 
glUniform1i(diffuse, 0); 


- (GLuint) loadTextureWithName: (NSString*) filename{ 

CGImageRef textureImage = [UIImage imageNamed: filename].CGImage; 
NSInteger texWidth = CGImageGetWidth(textureImage); 
NSInteger texHeight = CGImageGetHeight(textureImage); 
GLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight * 4*sizeof(GLubyte)); 
memset((void*) textureData, 0, texWidth * texHeight * 4*sizeof(GLubyte)); 
CGContextRef textureContext = CGBitmapContextCreate(textureData,texWidth,texHeight,8, texWidth * 4,CGImageGetColorSpace(textureImage),kCGImageAlphaPremultipliedLast); 

CGContextDrawImage(textureContext,CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight),textureImage); 

CGContextRelease(textureContext); 
//glActiveTexture(GL_TEXTURE0); 
//glShadeModel(GL_FLAT); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

//glGenTextures(1, &TEX); 
glBindTexture(GL_TEXTURE_2D, _textures[0]); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 
free(textureData); 
//texId = [NSNumber numberWithInt:TEX]; 
//[textureImage release];// 
//[textureContext release];// 
return _textures[0]; 
} 

- (GLuint) loadTextureWithName2: (NSString*) filename{ 

CGImageRef textureImage = [UIImage imageNamed: filename].CGImage; 
NSInteger texWidth = CGImageGetWidth(textureImage); 
NSInteger texHeight = CGImageGetHeight(textureImage); 
GLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight * 4*sizeof(GLubyte)); 
memset((void*) textureData, 0, texWidth * texHeight * 4*sizeof(GLubyte)); 
CGContextRef textureContext = CGBitmapContextCreate(textureData,texWidth,texHeight,8, texWidth * 4,   CGImageGetColorSpace(textureImage),kCGImageAlphaPremultipliedLast); 

CGContextDrawImage(textureContext,CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight),textureImage); 

CGContextRelease(textureContext); 
//glActiveTexture(GL_TEXTURE1); 
//glShadeModel(GL_FLAT); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

//glGenTextures(1, &TEX); 
glBindTexture(GL_TEXTURE_2D, _textures[1]); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 
free(textureData); 

return _textures[1]; 
} 

回答

2

這兩條線:

glUniform1i(bump, 0); 
glUniform1i(diffuse, 0); 

出現到這兩個sampler2D S的指向第一個紋理單元。我想像你想要的:

glUniform1i(diffuse, 1); 

要設置傳遞給它的紋理單元,它應該從閱讀sampler2D