2013-10-08 42 views
0

我正在使用3個紋理。但只有兩個紋理正在工作。多個紋理不起作用

enum { 
UNIFORM_TEXTURE, 
UNIFORM_TEXTURE_MAP, 
UNIFORM_INPUT1, 
NUM_UNIFORMS}; 
GLint uniforms[NUM_UNIFORMS]; 

第三個不顯示。這是我如何激活紋理:

glActiveTexture(GL_TEXTURE0); 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, textureName); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    // second texture 

    glActiveTexture(GL_TEXTURE1); 
    glBindTexture(GL_TEXTURE_2D, textureName1); 
    glEnable(GL_TEXTURE_2D); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); 
    // thrid texture 
    glActiveTexture(GL_TEXTURE2); 
    glBindTexture(GL_TEXTURE_2D, textureName2); 
    glEnable(GL_TEXTURE_2D); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); 


glUniform1i(uniforms[UNIFORM_TEXTURE], 0); 
    glUniform1i(uniforms[UNIFORM_TEXTURE_MAP], 1); 
    glUniform1i(uniforms[UNIFORM_INPUT1],2); 

uniforms[UNIFORM_TEXTURE] = glGetUniformLocation(program, "texture"); 
uniforms[UNIFORM_TEXTURE_MAP] = glGetUniformLocation(program,"texture2"); 
uniforms[UNIFORM_INPUT1]= glGetUniformLocation(program, "texture3"); 

在我的着色我呼籲只有第三個紋理進行檢查。

highp vec4 texel = texture2D(texture3,texCoordVarying); 
highp vec2 coord = 0.5 * (texel.xy/0.8); 
gl_FragColor = vec4(coord,0,0); 

在這裏,我怎麼加載質地:

- (void)loadTexture:(GLuint *)newTextureName fromFile:(NSString *)fileName { 
    // Load image from file and get reference 
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:nil]]; 
    CGImageRef imageRef = [image CGImage]; 

    if(imageRef) { 
     // get width and height 
     size_t imageWidth = CGImageGetWidth(imageRef); 
     size_t imageHeight = CGImageGetHeight(imageRef); 

     GLubyte *imageData = (GLubyte *)malloc(imageWidth * imageHeight * 4); 
     memset(imageData, 0, (imageWidth * imageHeight * 4)); 

     CGContextRef imageContextRef = CGBitmapContextCreate(imageData, imageWidth, imageHeight, 8, imageWidth * 4, CGImageGetColorSpace(imageRef), kCGImageAlphaPremultipliedLast); 

     // Make CG system interpret OpenGL style texture coordinates properly by inverting Y axis 
     CGContextTranslateCTM(imageContextRef, 0, imageHeight); 
     CGContextScaleCTM(imageContextRef, 1.0, -1.0); 

     CGContextDrawImage(imageContextRef, CGRectMake(0.0, 0.0, (CGFloat)imageWidth, (CGFloat)imageHeight), imageRef); 

     CGContextRelease(imageContextRef); 

     glGenTextures(1, newTextureName); 

     glBindTexture(GL_TEXTURE_2D, *newTextureName); 

     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWidth, imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 

     free(imageData); 

     glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
    } 

    [image release]; 
} 

- (void)awakeFromNib 
{ 
    EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:2]; 

if (!aContext) 
    NSLog(@"Failed to create ES context"); 
else if (![EAGLContext setCurrentContext:aContext]) 
    NSLog(@"Failed to set ES context current"); 

self.context = aContext; 
[aContext release]; 

[(EAGLView *)self.view setContext:context]; 
[(EAGLView *)self.view setFramebuffer]; 

[self loadShaders]; 

[self loadTexture:&textureName fromFile:@"image.png"]; 
[self loadTexture:&textureName1 fromFile:@"image1.png"]; 
[self loadTexture:&textureName2 fromFile:@"image2.png"]; 
GLint framebufferWidth, framebufferHeight; 

glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth); 
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT,&framebufferHeight); 


[self drawFrame]; 
} 
+0

任何着色器?最新制服[UNIFORM_TEXTURE]? –

+0

你從這段代碼中除了什麼?在GLSL代碼中你的紋理之間沒有任何組合。我不知道你除了 –

+0

我不明白你的意思是什麼紋理之間沒有任何組合? – user2858284

回答

0

我感覺還有其他一些問題,但對於初學者...

你想上傳之前的值到這些位置,以獲得均勻的位置。所以,你宣佈你的陣列

GLint uniforms[NUM_UNIFORMS]

您正在使用的陣列來存儲您的統一位置(也許你可以將其重命名爲uniformLocations?)這樣就可以進行呼叫glUniform1i,使用存儲在'制服的位置。由於內容未定義,誰知道您正在使用的值發生了什麼。

在您上傳統一值後,您然後用glGetUniformLocation查詢統一位置,這會填充您的陣列。你應該查詢,然後上傳。因此,將代碼更改爲:

uniforms[UNIFORM_TEXTURE] = glGetUniformLocation(program, "texture"); 
uniforms[UNIFORM_TEXTURE_MAP] = glGetUniformLocation(program,"texture2"); 
uniforms[UNIFORM_INPUT1]= glGetUniformLocation(program, "texture3"); 

glUniform1i(uniforms[UNIFORM_TEXTURE], 0); 
glUniform1i(uniforms[UNIFORM_TEXTURE_MAP], 1); 
glUniform1i(uniforms[UNIFORM_INPUT1],2); 

最重要的是,您可能希望使用glGetError來調試您的代碼。你可以把它放在代碼的某個部分來縮小問題的範圍,或者在調用glGetError的地方創建一個宏,並對任何錯誤進行斷言,並在每次OGL調用後插入該宏。

0

嗯,我找到了第三個紋理的問題我添加兩個另一glTexParameteri 這樣的:

 glActiveTexture(GL_TEXTURE0); 
     glEnable(GL_TEXTURE_2D); 
     glBindTexture(GL_TEXTURE_2D, textureName); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

     // second texture 
     glActiveTexture(GL_TEXTURE1); 
     glBindTexture(GL_TEXTURE_2D, textureName1); 
     glEnable(GL_TEXTURE_2D); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); 

     glActiveTexture(GL_TEXTURE2); 
     glBindTexture(GL_TEXTURE_2D, textureName2); 
     glEnable(GL_TEXTURE_2D); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

,並且着色器接收第三個紋理。