iphone - 在着色器中传递纹理

标签 iphone ios opengl-es shader

问题是我在着色器中传递了两个纹理,但是 3-d 模型上的图片对于两个 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];
}

最佳答案

这两行:

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

似乎将您的两个 sampler2D 指向第一个纹理单元。我想你想要:

glUniform1i(diffuse, 1);

要设置一个 sampler2D,您将它传递给它应该从中读取的纹理单元。

关于iphone - 在着色器中传递纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7626619/

相关文章:

javascript - 在 WEBGL 中获取学习矩阵的第一步

iphone - Xcode 4.3.2 - 用于分发应用程序的基础 SDK

ios - 可调整大小的 UIView

ios - 如何在 Swift 中的不同 UIViewController 中显示计时器?

opengl-es - glVertexPointer 应该包含不同的顶点还是所有顶点?

opengl-es - SGX 530 上的eglSwapBuffers 速度很慢

iphone - iPad 上的 UITextView 慢得令人难以置信

ios - 检查 Swift 数组上的重复属性

iphone - 将 SoundTouch 添加到 Xcode/iPhone

ios - 在 Swift 中分配字符串数组时出错