opengl es2 创建两个三角形
2015-08-27 17:39
302 查看
#include "stdafx.h"
#include <stdlib.h>
#include "esUtil.h"
typedef struct
{
// Handle to a program object
GLuint programObject;
} UserData;
///
// Create a shader object, load the shader source, and
// compile the shader.
//
GLuint LoadShader ( GLenum type, const char *shaderSrc )
{
GLuint shader;
GLint compiled;
// Create the shader object
shader = glCreateShader ( type ); //创建一个着色器
if ( shader == 0 )
return 0;
// Load the shader source
glShaderSource ( shader, 1, &shaderSrc, NULL ); //指定着色器源代码
// Compile the shader
glCompileShader ( shader ); //编译着色器
// Check the compile status
glGetShaderiv ( shader, GL_COMPILE_STATUS, &compiled ); //查看编译着色器是否成功,可选的查询状态有GL_DELETE_STATUS,GL_COMPILE_STATUS, GL_INFO_LOG_LENGTH, GL_SHADER_SOURCE_LENGTH
//如果编译出错,则记录出错信息
if ( !compiled )
{
GLint infoLen = 0;
glGetShaderiv ( shader, GL_INFO_LOG_LENGTH, &infoLen );
if ( infoLen > 1 )
{
char* infoLog = (char *)malloc (sizeof(char) * infoLen );
glGetShaderInfoLog ( shader, infoLen, NULL, infoLog );
esLogMessage ( "Error compiling shader:\n%s\n", infoLog );
free ( infoLog );
}
glDeleteShader ( shader ); //删除着色器
return 0;
}
return shader;
}
///
// Initialize the shader and program object
//
int Init ( ESContext *esContext )
{
UserData *userData = (UserData *)esContext->userData;
GLbyte vShaderStr[] =
"attribute vec4 vPosition; \n"
"attribute vec4 vColor; \n"
"varying vec4 v_col; \n"
"void main() \n"
"{ \n"
" gl_Position = vPosition; \n"
" v_col = vColor; \n"
"} \n";
GLbyte fShaderStr[] =
"precision mediump float;\n"
"varying vec4 v_col; \n"
"void main() \n"
"{ \n"
" gl_FragColor = v_col; \n"
"} \n";
GLuint vertexShader;
GLuint fragmentShader;
GLuint programObject;
GLint linked;
// Load the vertex/fragment shaders
vertexShader = LoadShader ( GL_VERTEX_SHADER, (const char *)vShaderStr );
fragmentShader = LoadShader ( GL_FRAGMENT_SHADER, (const char *)fShaderStr );
// Create the program object
programObject = glCreateProgram ( ); //创建一个渲染程序
if ( programObject == 0 )
return 0;
glAttachShader ( programObject, vertexShader ); //将着色器添加到程序中
glAttachShader ( programObject, fragmentShader );
glBindAttribLocation ( programObject, 0, "vPosition" );
glBindAttribLocation ( programObject, 1, "vColor" );
// Bind vPosition to attribute 0
// Link the program
glLinkProgram ( programObject ); //你可能添加了多个着色器,链接程序
// Check the link status
glGetProgramiv ( programObject, GL_LINK_STATUS, &linked );
if ( !linked )
{
GLint infoLen = 0;
glGetProgramiv ( programObject, GL_INFO_LOG_LENGTH, &infoLen );
if ( infoLen > 1 )
{
char* infoLog = (char *)malloc (sizeof(char) * infoLen );
glGetProgramInfoLog ( programObject, infoLen, NULL, infoLog );
esLogMessage ( "Error linking program:\n%s\n", infoLog );
free ( infoLog );
}
glDeleteProgram ( programObject );
return FALSE;
}
// Store the program object
userData->programObject = programObject;
glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f );
return TRUE;
}
///
// Draw a triangle using the shader pair created in Init()
//
void Draw ( ESContext *esContext )
{
UserData *userData = (UserData *)esContext->userData;
GLfloat vVertices[] =
{
//前三个点为Triangle1, 后三个点为Triangle2
-0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
};
GLfloat vColor[] =
{
1.0f, 1.0f, 0.0f,
1.0f, 0.0f, 0.0f,
};
GLubyte pos[] =
{
0, 1, 2, 3, 4, 5
};
// Set the viewport
glViewport ( 0, 0, esContext->width, esContext->height ); //窗口绘制的区域(相对于esCreateWindow创建的窗口), 此时表示OpenGL将把渲染结果绘制到整个窗口
// Clear the color buffer
glClear ( GL_COLOR_BUFFER_BIT );
// Use the program object
glUseProgram ( userData->programObject ); //使用 shader program
// Load the vertex data
glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );
glEnableVertexAttribArray ( 0 );
glVertexAttrib4fv(1, vColor);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, pos);
glVertexAttrib4fv(1, vColor + 3);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, pos + 1);
eglSwapBuffers ( esContext->eglDisplay, esContext->eglSurface );
}
int main ( int argc, char *argv[] )
{
ESContext esContext;
UserData userData;
printf("%d", sizeof(GLfloat));
esInitContext ( &esContext );
esContext.userData = &userData;
esCreateWindow ( &esContext, "mult Triangle", 320, 240, ES_WINDOW_RGB);
if ( !Init ( &esContext ) )
return 0;
esRegisterDrawFunc ( &esContext, Draw );
esMainLoop ( &esContext );
}
运行结果:
#include <stdlib.h>
#include "esUtil.h"
typedef struct
{
// Handle to a program object
GLuint programObject;
} UserData;
///
// Create a shader object, load the shader source, and
// compile the shader.
//
GLuint LoadShader ( GLenum type, const char *shaderSrc )
{
GLuint shader;
GLint compiled;
// Create the shader object
shader = glCreateShader ( type ); //创建一个着色器
if ( shader == 0 )
return 0;
// Load the shader source
glShaderSource ( shader, 1, &shaderSrc, NULL ); //指定着色器源代码
// Compile the shader
glCompileShader ( shader ); //编译着色器
// Check the compile status
glGetShaderiv ( shader, GL_COMPILE_STATUS, &compiled ); //查看编译着色器是否成功,可选的查询状态有GL_DELETE_STATUS,GL_COMPILE_STATUS, GL_INFO_LOG_LENGTH, GL_SHADER_SOURCE_LENGTH
//如果编译出错,则记录出错信息
if ( !compiled )
{
GLint infoLen = 0;
glGetShaderiv ( shader, GL_INFO_LOG_LENGTH, &infoLen );
if ( infoLen > 1 )
{
char* infoLog = (char *)malloc (sizeof(char) * infoLen );
glGetShaderInfoLog ( shader, infoLen, NULL, infoLog );
esLogMessage ( "Error compiling shader:\n%s\n", infoLog );
free ( infoLog );
}
glDeleteShader ( shader ); //删除着色器
return 0;
}
return shader;
}
///
// Initialize the shader and program object
//
int Init ( ESContext *esContext )
{
UserData *userData = (UserData *)esContext->userData;
GLbyte vShaderStr[] =
"attribute vec4 vPosition; \n"
"attribute vec4 vColor; \n"
"varying vec4 v_col; \n"
"void main() \n"
"{ \n"
" gl_Position = vPosition; \n"
" v_col = vColor; \n"
"} \n";
GLbyte fShaderStr[] =
"precision mediump float;\n"
"varying vec4 v_col; \n"
"void main() \n"
"{ \n"
" gl_FragColor = v_col; \n"
"} \n";
GLuint vertexShader;
GLuint fragmentShader;
GLuint programObject;
GLint linked;
// Load the vertex/fragment shaders
vertexShader = LoadShader ( GL_VERTEX_SHADER, (const char *)vShaderStr );
fragmentShader = LoadShader ( GL_FRAGMENT_SHADER, (const char *)fShaderStr );
// Create the program object
programObject = glCreateProgram ( ); //创建一个渲染程序
if ( programObject == 0 )
return 0;
glAttachShader ( programObject, vertexShader ); //将着色器添加到程序中
glAttachShader ( programObject, fragmentShader );
glBindAttribLocation ( programObject, 0, "vPosition" );
glBindAttribLocation ( programObject, 1, "vColor" );
// Bind vPosition to attribute 0
// Link the program
glLinkProgram ( programObject ); //你可能添加了多个着色器,链接程序
// Check the link status
glGetProgramiv ( programObject, GL_LINK_STATUS, &linked );
if ( !linked )
{
GLint infoLen = 0;
glGetProgramiv ( programObject, GL_INFO_LOG_LENGTH, &infoLen );
if ( infoLen > 1 )
{
char* infoLog = (char *)malloc (sizeof(char) * infoLen );
glGetProgramInfoLog ( programObject, infoLen, NULL, infoLog );
esLogMessage ( "Error linking program:\n%s\n", infoLog );
free ( infoLog );
}
glDeleteProgram ( programObject );
return FALSE;
}
// Store the program object
userData->programObject = programObject;
glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f );
return TRUE;
}
///
// Draw a triangle using the shader pair created in Init()
//
void Draw ( ESContext *esContext )
{
UserData *userData = (UserData *)esContext->userData;
GLfloat vVertices[] =
{
//前三个点为Triangle1, 后三个点为Triangle2
-0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
};
GLfloat vColor[] =
{
1.0f, 1.0f, 0.0f,
1.0f, 0.0f, 0.0f,
};
GLubyte pos[] =
{
0, 1, 2, 3, 4, 5
};
// Set the viewport
glViewport ( 0, 0, esContext->width, esContext->height ); //窗口绘制的区域(相对于esCreateWindow创建的窗口), 此时表示OpenGL将把渲染结果绘制到整个窗口
// Clear the color buffer
glClear ( GL_COLOR_BUFFER_BIT );
// Use the program object
glUseProgram ( userData->programObject ); //使用 shader program
// Load the vertex data
glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );
glEnableVertexAttribArray ( 0 );
glVertexAttrib4fv(1, vColor);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, pos);
glVertexAttrib4fv(1, vColor + 3);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, pos + 1);
eglSwapBuffers ( esContext->eglDisplay, esContext->eglSurface );
}
int main ( int argc, char *argv[] )
{
ESContext esContext;
UserData userData;
printf("%d", sizeof(GLfloat));
esInitContext ( &esContext );
esContext.userData = &userData;
esCreateWindow ( &esContext, "mult Triangle", 320, 240, ES_WINDOW_RGB);
if ( !Init ( &esContext ) )
return 0;
esRegisterDrawFunc ( &esContext, Draw );
esMainLoop ( &esContext );
}
运行结果:
相关文章推荐
- org.apache.axis2.AxisFault: The AXIS engine could not find a target service to invoke! targetServic
- Linux基础(一)安装Linux后简单系统优化
- Linux_1day------------安装yum--------linux命令学习
- Linux中使用SecureCRT上传、下载文件命令sz与rz用法实例
- org.apache.axis2.AxisFault: No such operation 'plus'
- php apache phpmyadmin mysql环境安装
- 浅谈设计之源 & 之美
- linux VM复制多个IP配置出错的处理
- Tomcat 7bug
- Tomcat网站主机绑定域名
- 在Eclipse中启动Tomcat, 访问不了
- Linux学习笔记-----挂载到底是什么意思???本质是什么???
- log4j.properties 详解与配置步骤
- linux服务器安装svn版本控制,自动部署代码到项目目录
- Linux学习笔记-----挂载光盘
- linux下修改mtu值
- 【Developer Log】Log4j v2
- cacti监控服务器
- OPENWRT make defconfig错误之一
- Docker常用命令操作