opengl es2 创建两个三角形

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

}


运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值