您的位置:首页 > 运维架构

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 );

}

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: