我正在使用GLKit获取opengl es 2.0。我可以成功地绘制正方形,三角形,立方体等形状。
我有问题绘图点,这里是我的代码,它不能在设备上工作(iPod 4),虽然我可以在视网膜模拟器中看到点/点。
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
//White background color
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
[self.effect prepareToDraw];
//USING _program
glUseProgram(_program);
GLfloat vert[] = {0,0, 0.1,0.1, 0.2,0.2, 0.3,0.3, 0.4,0.4, 0.5,0.5};
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, vert);
glDrawArrays(GL_POINTS, 0, 5);
glDisableVertexAttribArray(GLKVertexAttribPosition);
}
这是我的更新方法,仅供参考:
- (void)update {
float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 4.0f, 10.0f);
self.effect.transform.projectionMatrix = projectionMatrix;
//Since visible range is 4 to 10 so have to mave back in z
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -6.0f);
self.effect.transform.modelviewMatrix = modelViewMatrix;
}
以下是我如何定义效果:
self.effect = [[GLKBaseEffect alloc] init];
self.effect.useConstantColor = GL_TRUE;
self.effect.constantColor = GLKVector4Make(0.0, 0.0, 1.0, 1.0); //Blue color
这样点就可以在白色背景上看到。
有人能指出此代码中的任何缺陷吗?我不知道为什么它没有在设备上显示,因为三角形,正方形和立方体都是可见的。 任何帮助表示赞赏。
修改
我之前没有使用过着色器,所以这是我的第一次。正如Ben提到的示例代码。现在我正在做的事情:
我有 VertexShader.glsl 和 FragmentShader.glsl 文件:
VertexShader.glsl
void main()
{
gl_PointSize = 10.0;
}
FragmentShader.glsl
void main()
{
}
我在创建效果之前和设置EAGLContext之后设置了着色器:
// Setup shader
GLuint vertexShader = [self createShaderWithFile:@"VertexShader.glsl" type:GL_VERTEX_SHADER];
GLuint fragmentShader = [self createShaderWithFile:@"FragmentShader.glsl" type:GL_FRAGMENT_SHADER];
_program = glCreateProgram();
glAttachShader(_program, vertexShader);
glAttachShader(_program, fragmentShader);
glLinkProgram(_program);
GLint linked = 0;
glGetProgramiv(_program, GL_LINK_STATUS, &linked);
if (linked == 0) {
glDeleteProgram(_program);
return;
}
这是createShaderWithFile方法:
- (GLuint)createShaderWithFile:(NSString *)filename type:(GLenum)type
{
GLuint shader = glCreateShader(type);
if (shader == 0) {
return 0;
}
NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:filename];
NSString *shaderString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
const GLchar *shaderSource = [shaderString cStringUsingEncoding:NSUTF8StringEncoding];
glShaderSource(shader, 1, &shaderSource, NULL);
glCompileShader(shader);
GLint success = 0;
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (success == 0) {
char errorMsg[2048];
glGetShaderInfoLog(shader, sizeof(errorMsg), NULL, errorMsg);
NSString *errorString = [NSString stringWithCString:errorMsg encoding:NSUTF8StringEncoding];
NSLog(@"Failed to compile %@: %@", filename, errorString);
glDeleteShader(shader);
return 0;
}
return shader;
}
我还更新了上面的drawRect方法。
答案 0 :(得分:1)
尝试将顶点着色器中的gl_PointSize
变量设置为更大的值。也许你看不到设备上的单个像素。