OpenGL绘制一个三角形
应该建立一个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绘制一个三角形的更多相关文章
- [Modern OpenGL系列(三)]用OpenGL绘制一个三角形
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51347008 在上一篇文章中已经介绍了OpenGL窗口的创建.本文接着说如 ...
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形 【转】
http://blog.csdn.net/xiajun07061225/article/details/7628146 以前都是用Cg的,现在改用GLSL,又要重新学,不过两种语言很多都是相通的. 下 ...
- WebGL简易教程(三):绘制一个三角形(缓冲区对象)
目录 1. 概述 2. 示例:绘制三角形 1) HelloTriangle.html 2) HelloTriangle.js 3) 缓冲区对象 (1) 创建缓冲区对象(gl.createBuffer( ...
- OpenGl 绘制一个立方体
OpenGl 绘制一个立方体 为了绘制六个正方形,我们为每个正方形指定四个顶点,最终我们需要指定6*4=24个顶点.但是我们知道,一个立方体其实总共只有八个顶点,要指定24次,就意味着每个顶点其实重复 ...
- Unity3D学习笔记1——绘制一个三角形
目录 1. 绪论 2. 概述 3. 详论 3.1. 准备 3.2. 实现 3.3. 解析 3.3.1. 场景树对象 3.3.2. 绘制方法 4. 结果 1. 绪论 最近想学习一下Unity3d,无奈发 ...
- Opentk教程系列-1绘制一个三角形
本系列教程翻译自Neo Kabuto's Blog.已经取得作者授权. 本文原文地址http://neokabuto.blogspot.com/2013/02/opentk-tutorial-1-op ...
- OpenTK教程-2绘制一个三角形(正确的方法)
上一个教程向我们展示了如何在屏幕上画一个三角形.但是,我说过,那是一种古老的方式,即使它能够正常运行,但是现在这已经不是"正确"的方式.上篇文章中我们将几何发送到GPU的方式是所谓 ...
- OpenTK教程-2绘制一个三角形(正确的方式)
上一个教程向我们展示了如何在屏幕上画一个三角形.但是,我说过,那是一种古老的方式,即使它能够正常运行,但是现在这已经不是"正确"的方式.上篇文章中我们将几何发送到GPU的方式是所谓 ...
- OpenTK教程-1绘制一个三角形
OpenTK的官方文档是真心的少,他们把怎么去安装OpenTK说的很清楚,但是也就仅限于此,这有一篇learn opentk in 15的教程(链接已经失效,译者注),但是并不完美.你可以在15分钟内 ...
随机推荐
- luoguP5074 Eat the Trees
https://www.luogu.org/problemnew/show/P5074 插头 $ dp $ 入门题 如果你还不会插头 $ dp $ 请右转 洛谷插头dp题解 虽然是入门题但还是逃不过分 ...
- 把redhat源换成centos的,解决redhat未注册不能下载相关软件的问题
修改 vim /etc/yum.repos.d/centos-base.repo如下,清华源地址为 https://mirrors.tuna.tsinghua.edu.cn/help/cento ...
- leetcode-482-License Key Formatting
题目描述: You are given a license key represented as a string S which consists only alphanumeric charact ...
- Asp.net的生命周期应用之IHttpModule和IHttpHandler
摘自:http://www.cnblogs.com/JimmyZhang/archive/2007/11/25/971878.html 从 Http 请求处理流程 一文的最后的一幅图中可以看到,在Ht ...
- 四、OE 中添加对供应商名称的唯一限制
最初的思路是利用sql_constraints 来限制重复的供应商名称,但后来想到在OE中供应商.客户乃至员工都隶属于Partner,sql_constrainst实际上是通过限制partner来限制 ...
- Sublime Text 3新建工程
1. 创建工程 Project > Add Folder to Project 这时在sidebar中将出现刚刚添加的文件目录,如果还需要添加其他目录,则重复这一操作即可. 2. 保存工程 Pr ...
- shiro学习笔记_0300_jdbcRealm和认证策略
使用shiro框架来完成认证工作,默认是iniRealm,如果需要使用其他的realm,需要配置. ini配置文件详解,官方文档的说明如下: [main] section 是你配置应用程序的 Secu ...
- Jmeter创建WebService 测试计划
构建 WebService 测试计划 在本章节,你将学习如何创建一个 测试计划 去测试 WebService.先创建5个用户请求同一个页面,同时每个请求重复2次,因此总数为(5个用户)X(1次请求)X ...
- 对于maven创建spark项目的pom.xml配置文件(图文详解)
不多说,直接上干货! http://mvnrepository.com/ 这里,怎么创建,见 Spark编程环境搭建(基于Intellij IDEA的Ultimate版本)(包含Java和Scala版 ...
- Oracle 12c 创建用户
本文转载自 http://blog.itpub.net/29047826/viewspace-1453577/,侵删. 12c推出了可插拔库,管理用户也分为两种:本地用户和公用用户.本地用户是指在 ...