2013-05-21 119 views
1

我創建了一個程序,它允許我顯示3D objects,現在我想創建一個與另一個對象相關的cut。這是我的結果:screen着色器不起作用 - OpenGL ES

屏幕顯示我們可以看穿切割部分。所以我決定用shader來填補這個切割部分。

我試圖加載一個shader,然後在glUniform3f中使用它,但這是行不通的。我在互聯網上進行了幾次搜索,結果沒有。

這裏是我的類加載shader

- (id)initWithVertexShaderFilename:(NSString *)vShaderFilename 
     fragmentShaderFilename:(NSString *)fShaderFilename 
{ 
NSLog(fShaderFilename); 
if (self = [super init]) 
{ 
    attributes = [[NSMutableArray alloc] init]; 
    NSString *vertShaderPathname, *fragShaderPathname; 
    program = glCreateProgram(); 

    vertShaderPathname =[[NSBundle mainBundle] 
         pathForResource:vShaderFilename 
         ofType:@"vsh" 
         inDirectory:@"Shader"]; 

    if (![self compileShader:&vertShader 
         type:GL_VERTEX_SHADER 
         file:vertShaderPathname]) 
     NSLog(@"Failed to compile vertex shader"); 
    else 
     NSLog(@"Vertex Shader OK"); 

    fragShaderPathname = [[NSBundle mainBundle] 
          pathForResource:fShaderFilename 
          ofType:@"fsh" 
          inDirectory:@"Shader"]; 

    if (![self compileShader:&fragShader 
         type:GL_FRAGMENT_SHADER 
         file:fragShaderPathname]) 
     NSLog(@"Failed to compile fragment shader"); 
    else 
     NSLog(@"Fragment shader OK"); 
    glAttachShader(program, vertShader); 
    glAttachShader(program, fragShader); 
} 

return self; 
} 

- (BOOL)compileShader:(GLuint *)shader 
      type:(GLenum)type 
      file:(NSString *)file 
{ 
    NSLog(@"bonjour"); 
    GLint status; 
    const GLchar *source; 

    source = 
    (GLchar *)[[NSString stringWithContentsOfFile:file 
            encoding:NSUTF8StringEncoding 
             error:nil] UTF8String]; 
    if (!source) 
    { 
     NSLog(@"Failed to load vertex shader"); 
     return NO; 
    } 

    *shader = glCreateShader(type); 
    glShaderSource(*shader, 1, &source, NULL); 
    glCompileShader(*shader); 

    glGetShaderiv(*shader, GL_COMPILE_STATUS, &status); 
    NSString *intString = [NSString stringWithFormat:@"%d", status]; 
    return status = GL_TRUE; 
} 

#pragma mark - 
- (void)addAttribute:(NSString *)attributeName 
{ 
    if (![attributes containsObject:attributeName]) 
    { 
     [attributes addObject:attributeName]; 
     glBindAttribLocation(program, 
         [attributes indexOfObject:attributeName], 
         [attributeName UTF8String]); 
    } 
} 

- (GLuint)attributeIndex:(NSString *)attributeName 
{ 
    return [attributes indexOfObject:attributeName]; 
} 

- (GLuint)uniformIndex:(NSString *)uniformName 
{ 
    return glGetUniformLocation(program, [uniformName UTF8String]); 
} 

#pragma mark - 
- (BOOL)link 
{ 
    GLint status; 

    glLinkProgram(program); 
    glValidateProgram(program); 

    glGetProgramiv(program, GL_LINK_STATUS, &status); 
    if (status == GL_FALSE) 
     return NO; 

    if (vertShader) 
     glDeleteShader(vertShader); 
    if (fragShader) 
     glDeleteShader(fragShader); 

    return YES; 
} 

- (void)use 
{ 
    glUseProgram(program); 
} 

這裏是初始化我shaders在主類中的函數:

- (void)setup 
{ 
    GLShader *theProgram = [[GLShader alloc] initWithVertexShaderFilename:@"shader" 
               fragmentShaderFilename:@"shader"]; 
    self.program = theProgram; 

    [self.program addAttribute:@"position"]; 
    [self.program addAttribute:@"textureCoordinates"]; 

    if (![self.program link]) 
    { 
     NSLog(@"Link failed"); 

     NSString *progLog = [self.program programLog]; 
     NSLog(@"Program Log: %@", progLog); 

     NSString *fragLog = [self.program fragmentShaderLog]; 
     NSLog(@"Frag Log: %@", fragLog); 

     NSString *vertLog = [self.program vertexShaderLog]; 
     NSLog(@"Vert Log: %@", vertLog); 

     //[(GLView *)self.view stopAnimation]; 
     self.program = nil; 
    } 

    textureCoordinateAttribute = [program attributeIndex:@"textureCoordinates"]; 
    colorUniform = [program uniformIndex:@"uColor"]; 
    textureUniform = [program uniformIndex:@"texture"]; 
    //colorUniform = glGetUniformLocation(self.program, "uColor"); 

    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_CULL_FACE); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_ONE, GL_ZERO);  
} 

這裏就是我想用我的功能shader

-(void) draw 
{ 
    [self.program use]; 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
    glDepthMask(true); 
    lUniform3f(colorUniform,1.0, 1.0, 0.5); 
    [self drawSubtraction:image1 with:image2]; 

} 

這是我的fragment shader

precision highp float; 

uniform vec3 uColor; 
uniform vec3 uLight; 

varying vec3 vNormal; 

const float alpha = 0.7; 
void main(void) { 
float val = dot(vNormal, uLight) * 0.4 + 0.6; 

gl_FragColor = vec4(uColor * val, alpha); 
} 

我做錯了什麼?有人有一個想法可以幫助我嗎?

謝謝。

+0

我看到'lUniform3f',而不是'glUniform3f'。既然你所說的是「不起作用」,我認爲這是問題所在。 – AbleArcher

回答

0

您的着色器代碼看起來沒問題。確保正確地將「textureCoordinates」屬性傳遞給頂點着色器。您需要在初始化的某個時候撥打glEnableVertexAttribArray()glVertexAttribPointer()。根據您如何渲染模型,您可能需要確保正確傳遞頂點。

另外,我假設[self drawSubtraction:image1 with:image2]在某些時候調用glDrawArrays()glDrawElements()

Xcode的默認OpenGL遊戲項目是一個很好的開始加載着色器的地方,如果你想要一個項目進行比較。