应该建立一个vertex shader文件和一个pixel shader文件,分别命名为shader.vsh和shader.fsh。

shader.vsh:

attribute vec3 position;   //入参,主程序会将数值传入
void main()
{
gl_Position = vec4(position,); //顶点经过投影变换变换后的位置
}

shader.fsh:

void main()
{
gl_FragColor = vec4(0.5,0.5,0.5,); //顶点的颜色
}

ViewController.m中的代码如下:

//
// ViewController.m
// OpenGL学习Demo
//
// Created by 孙建飞 on 16/7/9.
// Copyright © 2016年 sjf. All rights reserved.
// #import "ViewController.h" #import <OpenGLES/ES3/gl.h>
#import <OpenGLES/ES3/glext.h> @interface ViewController ()
{
EAGLContext *context; //EAGLContent是苹果在ios平台下实现的opengles渲染层,用于渲染结果在目标surface上的更新。
GLuint program;//????????
GLuint vertexID;
// GLvoid *vec; }
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //三点的坐标:
GLKVector3 vec[]={
{0.5,0.5,},
{-0.5,-0.5,},
{0.5,-0.5,}, };
//初始化EAGLContext时指定ES版本号OPenGLES3
context=[[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES3];
if (!context) {
NSLog(@"failed to create ES context !")
;
}
//
GLKView *view=(GLKView *)self.view;
view.context=context;
view.drawableDepthFormat=GLKViewDrawableDepthFormat24;
[EAGLContext setCurrentContext:context];
glEnable(GL_DEPTH_TEST);//开启深度测试,就是让离你近的物体可以遮挡离你远的物体
glClearColor(0.1, 0.2, 0.3, ); //设置surface的清除颜色,也就是渲染到屏幕上的背景色。
//
[self loadShaders];
glEnable(GL_DEPTH_TEST);
glClearColor(0.1, 0.2, 0.3, );
// glGenVertexArrays(<#GLsizei n#>, <#GLuint *arrays#>)
glGenVertexArrays(, &vertexID);//生成一个vao对象
glBindVertexArray(vertexID); //绑定vao
GLuint bufferID;
glGenBuffers(, &bufferID); //生成vbo
//
glBindBuffer(GL_ARRAY_BUFFER, bufferID); //绑定
// glBufferData(<#GLenum target#>, <#GLsizeiptr size#>, <#const GLvoid *data#>, <#GLenum usage#>)
glBufferData(GL_ARRAY_BUFFER, sizeof(vec), vec, GL_STATIC_DRAW); //填充缓冲对象
GLuint loc=glGetAttribLocation(program, "position"); //获得shader里position变量的索引
glEnableVertexAttribArray(loc); //启用这个索引
glVertexAttribPointer(loc, , GL_FLOAT, GL_FALSE, sizeof(GLKVector3), ); //设置这个索引需要填充的内容
glBindVertexArray(); //释放vao
glBindBuffer(GL_ARRAY_BUFFER, ); //释放vbo
}
//隐藏状态栏
- (BOOL)prefersStatusBarHidden {
return YES;
}
//
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除surface内容,恢复至初始状态。
glBindVertexArray(vertexID);
glUseProgram(program); //使用shader
glDrawArrays(GL_TRIANGLES, , ); //绘制三角形
glBindVertexArray();
glBindBuffer(GL_ARRAY_BUFFER, );
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, );
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/***************************加载shader***************************/
- (BOOL)loadShaders
{
GLuint vertShader, fragShader;
NSString *vertShaderPathname, *fragShaderPathname; // Create shader program.
program = glCreateProgram(); // Create and compile vertex shader.
vertShaderPathname = [[NSBundle mainBundle] pathForResource:@"shader" ofType:@"vsh"];
if (![self compileShader:&vertShader type:GL_VERTEX_SHADER file:vertShaderPathname]) {
NSLog(@"Failed to compile vertex shader");
return NO;
} // Create and compile fragment shader.
fragShaderPathname = [[NSBundle mainBundle] pathForResource:@"shader" ofType:@"fsh"];
if (![self compileShader:&fragShader type:GL_FRAGMENT_SHADER file:fragShaderPathname]) {
NSLog(@"Failed to compile fragment shader");
return NO;
} // Attach vertex shader to program.
glAttachShader(program, vertShader); // Attach fragment shader to program.
glAttachShader(program, fragShader); // Link program.
if (![self linkProgram:program]) {
NSLog(@"Failed to link program: %d", program); if (vertShader) {
glDeleteShader(vertShader);
vertShader = ;
}
if (fragShader) {
glDeleteShader(fragShader);
fragShader = ;
}
if (program) {
glDeleteProgram(program);
program = ;
} return NO;
}
// Release vertex and fragment shaders.
if (vertShader) {
glDetachShader(program, vertShader);
glDeleteShader(vertShader);
}
if (fragShader) {
glDetachShader(program, fragShader);
glDeleteShader(fragShader);
} return YES;
} - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file
{
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, , &source, NULL);
glCompileShader(*shader); #if defined(DEBUG)
GLint logLength;
glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);
if (logLength > ) {
GLchar *log = (GLchar *)malloc(logLength);
glGetShaderInfoLog(*shader, logLength, &logLength, log);
NSLog(@"Shader compile log:\n%s", log);
free(log);
}
#endif glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);
if (status == ) {
glDeleteShader(*shader);
return NO;
} return YES;
} - (BOOL)linkProgram:(GLuint)prog
{
GLint status;
glLinkProgram(prog); #if defined(DEBUG)
GLint logLength;
glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
if (logLength > ) {
GLchar *log = (GLchar *)malloc(logLength);
glGetProgramInfoLog(prog, logLength, &logLength, log);
NSLog(@"Program link log:\n%s", log);
free(log);
}
#endif glGetProgramiv(prog, GL_LINK_STATUS, &status);
if (status == ) {
return NO;
} return YES;
} - (BOOL)validateProgram:(GLuint)prog
{
GLint logLength, status; glValidateProgram(prog);
glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
if (logLength > ) {
GLchar *log = (GLchar *)malloc(logLength);
glGetProgramInfoLog(prog, logLength, &logLength, log);
NSLog(@"Program validate log:\n%s", log);
free(log);
} glGetProgramiv(prog, GL_VALIDATE_STATUS, &status);
if (status == ) {
return NO;
} return YES;
} @end

运行后得到如下:

参考文献:

http://blog.csdn.net/sx1989827/article/details/47974595

OpenGL绘制一个三角形的更多相关文章

  1. [Modern OpenGL系列(三)]用OpenGL绘制一个三角形

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51347008 在上一篇文章中已经介绍了OpenGL窗口的创建.本文接着说如 ...

  2. 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形 【转】

    http://blog.csdn.net/xiajun07061225/article/details/7628146 以前都是用Cg的,现在改用GLSL,又要重新学,不过两种语言很多都是相通的. 下 ...

  3. WebGL简易教程(三):绘制一个三角形(缓冲区对象)

    目录 1. 概述 2. 示例:绘制三角形 1) HelloTriangle.html 2) HelloTriangle.js 3) 缓冲区对象 (1) 创建缓冲区对象(gl.createBuffer( ...

  4. OpenGl 绘制一个立方体

    OpenGl 绘制一个立方体 为了绘制六个正方形,我们为每个正方形指定四个顶点,最终我们需要指定6*4=24个顶点.但是我们知道,一个立方体其实总共只有八个顶点,要指定24次,就意味着每个顶点其实重复 ...

  5. Unity3D学习笔记1——绘制一个三角形

    目录 1. 绪论 2. 概述 3. 详论 3.1. 准备 3.2. 实现 3.3. 解析 3.3.1. 场景树对象 3.3.2. 绘制方法 4. 结果 1. 绪论 最近想学习一下Unity3d,无奈发 ...

  6. Opentk教程系列-1绘制一个三角形

    本系列教程翻译自Neo Kabuto's Blog.已经取得作者授权. 本文原文地址http://neokabuto.blogspot.com/2013/02/opentk-tutorial-1-op ...

  7. OpenTK教程-2绘制一个三角形(正确的方法)

    上一个教程向我们展示了如何在屏幕上画一个三角形.但是,我说过,那是一种古老的方式,即使它能够正常运行,但是现在这已经不是"正确"的方式.上篇文章中我们将几何发送到GPU的方式是所谓 ...

  8. OpenTK教程-2绘制一个三角形(正确的方式)

    上一个教程向我们展示了如何在屏幕上画一个三角形.但是,我说过,那是一种古老的方式,即使它能够正常运行,但是现在这已经不是"正确"的方式.上篇文章中我们将几何发送到GPU的方式是所谓 ...

  9. OpenTK教程-1绘制一个三角形

    OpenTK的官方文档是真心的少,他们把怎么去安装OpenTK说的很清楚,但是也就仅限于此,这有一篇learn opentk in 15的教程(链接已经失效,译者注),但是并不完美.你可以在15分钟内 ...

随机推荐

  1. Gogland使用 - 非常简单查看Go语言源代码全貌!

    Go语言也支持面向对象开发,不过和以往我们所使用的面向对象开发还是有不同,Go语言主张组合方式形成类的概念,在Go语言中,结构起到很大作用,如果用结构组合字段和方法,那么单纯在源代码中看,真的是费时费 ...

  2. java 实验6 图形用户界面设计试验(2)

    共两大题 窗体实现(略去测试类即 实例化自定义窗体) 小结: 1. JRadioButton 单选按钮 ButtonGroup 按钮集合(加入单选按钮) 清空选项需让ButtonGroup调用clea ...

  3. 关于Collections的操作方法

    Collections是一个包装类,其中包含有各种有关集合操作的静态多态方,比如可以作用在List和Set上,此类不能实例化. 排序 Integer[] array = new Integer[]{3 ...

  4. Centos 7.x 安装配置tomcat-8过程梳理

    ----------注意CentOS7.x中的selinux和firewalld都关闭.而且一.二.三部分都是独立的,所以发现8081和8080端口时不要慌哦. 原创,朋友们转载时请著名出处. 一.安 ...

  5. ElasticSearch.net NEST批量创建修改删除索引完整示例

    本示例采用Elasticsearch+Nest 网上查了很多资料,发现用C#调用Elasticsearch搜索引擎的功能代码很分散,功能不完整,多半是非常简单的操作,没有成型的应用示例.比如新增或修改 ...

  6. css 做幻灯片效果

     设置一个div 盒子 <div class="ani"></div> 设置css 样式 .ani{ width:480px; height:320px; ...

  7. HTML基础总纲

    我看了很多博客感觉如果自己写的话还不一定有人家写的好,在介于我没有时间从这么细小的知识总结,那么人家总结好的我们为什么不用,完了之后在就自己的感受和不足之处在做补充. 我们一个的讲:主要参考: 一,H ...

  8. 资产管理 cmdb之ansible 获取服务器硬件、软件等信息

    cmdb抓取服务信息的方式有很多种,可以使用自动化工具saltstack.ansible.puppet,或者使用其它模块直接ssh远程连接抓取服务器信息.这里记录一下用ansible的API接口调用s ...

  9. QuantLib 金融计算——数学工具之随机数发生器

    目录 QuantLib 金融计算--数学工具之随机数发生器 概述 伪随机数 正态分布(伪)随机数 拟随机数 HaltonRsg SobolRsg 两类随机数的收敛性比较 如果未做特别说明,文中的程序都 ...

  10. 判断h5页面是小程序环境还是微信环境

    1.话不多说直接上代码,已使用有效 <script type="text/javascript" src="https://res.wx.qq.com/open/j ...