我創建了一個程序,它允許我顯示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);
}
我做錯了什麼?有人有一個想法可以幫助我嗎?
謝謝。
我看到'lUniform3f',而不是'glUniform3f'。既然你所說的是「不起作用」,我認爲這是問題所在。 – AbleArcher