应该建立一个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. poj1166时钟翻转

    #include<stdio.h> #define TABLE_LEN 5 const int table[10][TABLE_LEN]= {{},{1,2,4,5},{1,2,3},{2 ...

  2. python3+requests:post请求四种传送正文方式(详解)

    前言:post请求我在python接口自动化2-发送post请求详解(二)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等,可以参考Get,Post请求方式经典详解进行学习一下. 我 ...

  3. 考试题 T3

    题意分析 首先\(\%\%\%\%olinr\)以及花_Q\(julao\)当场切题 然后就是怎么求 \[max(|a-A|,|b-B|)=max(a-A,A-a,B-b,b-B)\] 我们令\(x_ ...

  4. web环境中的spring MVC

    1. web.xml文件的简单详解 在web环境中, spring MVC是建立在IOC容器的基础上,要了解spring mvc,首先要了解Spring IOC容器是如何在web环境中被载入并起作用的 ...

  5. C#-WebForm-Javascript、Jquery获取浏览器和屏幕各种高度宽度

    Javascript: IE中:document.body.clientWidth ==> BODY对象宽度document.body.clientHeight ==> BODY对象高度d ...

  6. Python基础部分的疑惑解析——运算符和数据类型(3)

    补充上一篇: #! /user/bin/env python   代码内声明这一个就可以用1.py类似的文件直接执行,但是要在linux内加权限, 不需要在前面加python 1.py执行了.文件可以 ...

  7. SQL语句01

    SQL(Structured Query Language):结构化查询语言 SQL分类:    数据操纵语言DML(Data Manipulation Language)        SELECT ...

  8. Django分页类的封装

    Django分页类的封装 Django ORM  封装 之前有提到(Django分页的实现)会多次用到分页,将分页功能封装起来能极大提高效率. 其实不是很难,就是将之前实现的代码全都放到类中,将需要用 ...

  9. 查看linux上面是否有安装redis

  10. 基于iTop4412的FM收音机系统设计(三)

    说明:第一版架构为:APP+JNI(NDK)+Driver(linux),优点是开发简单,周期短,也作为自己的毕业设计 现在更新第二版,FM服务完全植入Android系统中,成为系统服务,架构为:AP ...