ZBLOG

Linux openGL ES画四个矩形

在 Linux 环境下使用 OpenGL ES 画四个矩形,你通常会使用 OpenGL ES 的 API。以下是一个简单的示例,展示如何创建一个窗口并在其上绘制四个矩形。

安装依赖

确保你已经安装了相关的库,比如 libGLES2libEGL。如果你使用的是 Ubuntu,可以通过以下命令安装它们:

sudo apt-get install libgles2-mesa-dev libegl1-mesa-dev

示例代码

这是一个基本的 C++ 程序,使用 OpenGL ES 绘制四个矩形:

#include <EGL/egl.h>
#include <GLES2/gl2.h>
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>

Display *display;
Window window;
EGLDisplay eglDisplay;
EGLContext eglContext;
EGLSurface eglSurface;

void init() {
    // 设置视口
    glViewport(0, 0, 800, 600);
    
    // 清空颜色缓冲区
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

void drawRect(float x, float y, float width, float height) {
    GLfloat vertices[] = {
        x, y,
        x + width, y,
        x + width, y + height,
        x, y + height,
    };

    GLuint vertexBuffer;
    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_FLOAT, 0, (void*)0);

    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

    glDisableClientState(GL_VERTEX_ARRAY);
    glDeleteBuffers(1, &vertexBuffer);
}

int main() {
    // 打开 X11 窗口
    display = XOpenDisplay(NULL);
    
    int screen = DefaultScreen(display);
    
    Window rootWindow = RootWindow(display, screen);
    
    // 创建窗口
    window = XCreateSimpleWindow(display,
                                  rootWindow,
                                  10,
                                  10,
                                  800,
                                  600,
                                  1,
                                  BlackPixel(display, screen),
                                  WhitePixel(display, screen));

    XMapWindow(display , window);    

   // EGL 初始化
   eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
   eglInitialize(eglDisplay , NULL , NULL );

   EGLConfig config;
   EGLint numConfigs;
   static const EGLint attribs[] = { 
       EGL_SURFACE_TYPE , EGL_WINDOW_BIT ,
       EGL_RENDERABLE_TYPE , EGL_OPENGL_ES2_BIT ,
       EGL_NONE 
   };
   
   eglChooseConfig(eglDisplay , attribs , &config , 1 , &numConfigs );
   
   eglSurface = eglCreateWindowSurface(eglDisplay , config , (NativeWindowType)window , NULL );
   
   static const EGLint context_attribs[] = {
       EGL_CONTEXT_CLIENT_VERSION , 2 ,
       EGL_NONE 
   };
   
   eglContext = eglCreateContext(eglDisplay , config , EGL_NO_CONTEXT , context_attribs );
   
   eglMakeCurrent(eglDisplay , eglSurface , eglSurface , eglContext );

   init();

   while (1) {
       // 清屏
       glClear(GL_COLOR_BUFFER_BIT);

       // 绘制四个矩形
       drawRect(-0.5f,-0.5f,.25f,.25f);      // 左下角矩形 
       drawRect(0.5f,-0.5f,.25f,.25f);      // 左下角矩形 
       drawRect(-0.5f,+0.5f,.25f,.25f);     // 左上角矩形 
       drawRect(+0.5f,+0.5f,.25f,.25f);     // 左上角矩形 

       eglSwapBuffers(eglDisplay , eglSurface );      
       
      if(XPending(display)) break;     
	}   

	// 清理资源  
	eglDestroyContext(eglDisplay , eglContext );  
	eglDestroySurface(eglDisplay ;ekgL Surface );  
	XDestroyWindow(display ; window );  
	XCloseDisplay (display );  

	return EXIT_SUCCESS;  
}

编译和运行

将以上代码保存到一个名为 main.cpp 的文件中,并使用以下命令编译:

g++ -o opengles_example main.cpp -lEGL -lGLESv2 -lX11

然后运行生成的可执行文件:

./opengles_example

注意事项

  • 此示例假定您正在使用具有 OpenGL ES 支持的系统,并且可以在您的环境中正确设置库。
  • 本例仅作为一个简单起点,真实项目中需要考虑更多因素,如错误处理、上下文管理等。

希望这对您有所帮助!如果有其他问题,请随时问我。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=6641

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?